%     AERO LOAD - программа для нагружения агрегатов самолета распределенной нагрузкой
%     Copyright (C) 2018-2024  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function [PSETS, ELEMENTS] = Read_PSETS_ELEMENTS(Fin, N_Elements, Element_start_position, N_PSETS, PSET_start_position, Region_Rec_start_position)

% ELEMENTS (карточки CTETRA, CPENTA, CHEXA) | .card | .ID | .Prop_ID | .N_nodes | .Nodes(N_nodes,1) |
% ELEMENTS (карточка CQUAD4) | .card | .ID | .Prop_ID | .G(4,1) | .THETA_MCID | .ZOFFS | .TFLAG | .T1 | .T2 | .T3 | .T4 | .Ori_type (CID | Angle) |
% ELEMENTS (карточка CQUAD8) | .card | .ID | .Prop_ID | .G(8,1) | .T1 | .T2 | .T3 | .T4 | .THETA_MCID | .ZOFFS | .TFLAG | .Ori_type (CID | Angle) |
% ELEMENTS (карточка CTRIA3) | .card | .ID | .Prop_ID | .G(3,1) | .THETA_MCID | .ZOFFS | .TFLAG | .T1 | .T2 | .T3 | .Ori_type (CID | Angle) |
% ELEMENTS (карточка CTRIA6) | .card | .ID | .Prop_ID | .G(6,1) | .THETA_MCID | .ZOFFS | .T1 | .T2 | .T3 | .TFLAG | .Ori_type (CID | Angle) |
% ELEMENTS (карточка  CBUSH) | .card | .ID | .Prop_ID | .GA | .GB | .GO | .X1 | .X2 | .X3 | .CID | .S | .OCID | .S1 | .S2 | .S3 |
% ELEMENTS (карточка   CROD) | .card | .ID | .Prop_ID | .G1 | .G2 |
% ELEMENTS (карточка   CBAR) | .card | .ID | .Prop_ID | .GA | .GB | .G0 | .X1 | .X2 | .X3 | .OFFT | .PA | .PB | .W1A | .W2A | .W3A | .W1B | .W2B | .W3B |
% ELEMENTS (карточка  CBEAM) | .card | .ID | .Prop_ID | .GA | .GB | .G0 | .X1 | .X2 | .X3 | .OFFT | .BIT | .PA | .PB | .W1A | .W2A | .W3A | .W1B | .W2B | .W3B | .SA | .SB |

% PSETS (карточка  PSOLID) | .card | .ID | .Patran_name | .Mat_ID | .CORDM | .IN | .STRESS | .ISOP | .FCTN | .COROT |
% PSETS (карточка   PCOMP) | .card | .ID | .Patran_name | .Patran_laminate_name | .Z0 | .NSM | .SB | .FT | .TREF | .GE | .LAM | .N_plies | .Laminate(N_plies,4) |
%           .Laminate(i,4) | MIDi | Ti | THETAi | SOUTi (1 = YES, 0 = NO) |
% PSETS (карточка  PCOMPG) | .card | .ID | .Patran_name | .Patran_laminate_name | .Z0 | .NSM | .SB | .FT | .TREF | .GE | .LAM | .N_plies | .Laminate(N_plies,5) | .GEFLG |
%           .Laminate(i,5) | GPLYIDi | MIDi | Ti | THETAi | SOUTi (1 = YES, 0 = NO) |
% PSETS (карточка  PSHELL) | .card | .ID | .Patran_name | .MID1 | .T | .MID2 | .I_ratio | .MID3 | .TS_T | .NSM | .Z1 | .Z2 | .MID4 |
% PSETS (карточка   PBUSH) | .card | .ID | .Patran_name | .K(6,1) | .B(6,1) | .GE(6,1) | .RCV(.SA .ST .EA .ET) | .M |
% PSETS (карточка    PROD) | .card | .ID | .Patran_name | .MID | .A | .J | .C | .NSM |
% PSETS (карточка PBMSECT) | .card | .ID | .Patran_name | .MID | .FORM | .Section_data |
% PSETS (карточка PBRSECT) | .card | .ID | .Patran_name | .MID | .FORM | .NSM | .Section_data |
% PSETS (карточка    PBAR) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 | .K1 | .K2 | .I12 |
% PSETS (карточка   PBARL) | .card | .ID | .Patran_name | .MID | .GROUP | .TYPE | .DIM(:,1)| .NSM |
%                   .TYPE = (ROD, TUBE, TUBE2, L, I, CHAN, T, BOX, BAR, CROSS, H, T1, I1, CHAN1, Z, CHAN2, T2, BOX1, HEXA, HAT, HAT1, DBOX )
% PSETS (карточка   PBEAM) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .I12 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 |
%                          | .N_intermediate_states | .Intermediate_states_data{N_intermediate_states,1} |
%                          | .K1 | .K2 | .S1 | .S2 | .NSI_A | .NSI_B | .CW_A | .CW_B | .M1_A | .M2_A | .M1_B | .M2_B | .N1_A | .N2_A | .N1_B | .N2_B |
%             .Intermediate_states_data{i} : { .SO | .X_XB | .A | .I1 | .I2 | .I12 | .J | .NSM | .C1 | .C2 | .D1 | .D2 | .E1 | .E2 | .F1 | .F2 }
% PSETS (карточка  PBEAML) | .card | .ID | .Patran_name | .MID | .GROUP | .TYPE | .DIM(:,1)| .NSM | .N_intermediate_states | .Intermediate_states_data{N_intermediate_states,1} |
%             .Intermediate_states_data{i} : { .SO | .X_XB | .DIM(:,1)| .NSM }
%                   .TYPE = (ROD, TUBE, TUBE2, L, I, CHAN, T, BOX, BAR, CROSS, H, T1, I1, CHAN1, Z, CHAN2, T2, BOX1, HEXA, HAT, HAT1, DBOX )
% PSETS (карточка  PBCOMP) | .card | .ID | .Patran_name | .MID | .A | .I1 | .I2 | .I12 | .J | .NSM | .K1 | .K2 | .M1 | .M2 | .N1 | .N2 | .SYMOPT | .N_lumped_areas | .Lumped_area_data{N_lumped_areas,1} |
%             .Lumped_area_data{i} : { .Y | .Z | .C | .MID }

% Внимание!
% Для property sets заполнение полей .Patran_name (.Patran_laminate_name) не гарантируется.
% Так, для карточки PBRSECT из комментария не считывается .Patran_name, так как перед ней могут находиться карточки SET3 / SET1

global ErrCode;
global Progress_Bar_Segments;
global Progress_Bar_Delay;

fprintf (1, '    Чтение property sets и элементов... ');

% Настройки первоначального выделения памяти (для ускорения чтения)
N_plies_preallocated = 1000; % число слоев в ламинате
N_pbeam_int_states_preallocated = 10;
N_pbeaml_int_states_preallocated = 15;
N_pbcomp_lumped_areas_preallocated = 20;

% Настройка размера массива предыдущих строк
N_previous_strings = 5; % Число должно быть >= 1

PSETS = cell(N_PSETS,1);
ELEMENTS = cell(N_Elements,1);

tmp_array = zeros(3,1);
tmp_array(1) = Element_start_position;
tmp_array(2) = PSET_start_position;
tmp_array(3) = Region_Rec_start_position;

fseek(Fin, min(tmp_array), 'bof');

PSET_read_counter = 0;
Element_read_counter = 0;


% Для вывода прогресса
Time_segments = Progress_Bar_Segments;
N_records = N_Elements + N_PSETS;
N_rec_segm = floor(N_records/Time_segments);
Counter = 0;
Counter_2 = 0;
Written_count = 0;


string = ' ';
Previous_strings = cell(N_previous_strings,1);
for i=1:N_previous_strings
    Previous_strings{i} = ' ';
end


while (~feof(Fin))
    
    if (PSET_read_counter + Element_read_counter == N_PSETS + N_Elements)
        break;        
    end
    
    % Чтение следующей строки
    N_prev_str = size(Previous_strings,1);
    for p=1:N_prev_str-1
        Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
    end
    Previous_strings{1} = string;
    string = fgets(Fin);
    
    switch string(1)
        
        case {'C', 'c'}
            
            % Чтение CTETRA (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'TETRA'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке CTETRA [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CTETRA';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.N_nodes = 0;
                        ELEMENTS{Element_read_counter}.Nodes = zeros(10,1);
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CTETRA : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CTETRA %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CTETRA : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CTETRA';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение полей карточки
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.Nodes,1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки твердотельных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.N_nodes = ELEMENTS{Element_read_counter}.N_nodes + 1;
                                ELEMENTS{Element_read_counter}.Nodes(i) = Read_Result;
                            end
                            
							if (End_card_flag == 1)
							    break;
							end

                        end

                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (ELEMENTS{Element_read_counter}.N_nodes == 0)
                            fprintf (1, '\nНе найдено узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end
                        
                        ELEMENTS{Element_read_counter}.Nodes = ELEMENTS{Element_read_counter}.Nodes(1:ELEMENTS{Element_read_counter}.N_nodes);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CTETRA';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.N_nodes = 0;
                        ELEMENTS{Element_read_counter}.Nodes = zeros(10,1);
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CTETRA* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CTETRA* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CTETRA* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CTETRA*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение полей карточки
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.Nodes,1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки твердотельных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.N_nodes = ELEMENTS{Element_read_counter}.N_nodes + 1;
                                ELEMENTS{Element_read_counter}.Nodes(i) = Read_Result;
                            end
                            
							if (End_card_flag == 1)
							    break;
							end

                        end

                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (ELEMENTS{Element_read_counter}.N_nodes == 0)
                            fprintf (1, '\nНе найдено узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end
                        
                        ELEMENTS{Element_read_counter}.Nodes = ELEMENTS{Element_read_counter}.Nodes(1:ELEMENTS{Element_read_counter}.N_nodes);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CTETRA,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [CTETRA%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CQUAD4 (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'QUAD4'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке CQUAD4 [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CQUAD4';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(4,1);
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.T4 = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CQUAD4 : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CQUAD4 %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CQUAD4 : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CQUAD4';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение THETA_MCID
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            if (Real_flag == 1)
                                ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                            else
                                ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                            end
                            ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                        end
                                                
                        % Чтение ZOFFS
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                        end
                                                
                        % Пропуск пустого поля
                        
                        if (End_card_flag ~= 1)
                        
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end
                        
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T1
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T1 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T2
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T2 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T3
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T3 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T4
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T4 = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CQUAD4';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(4,1);
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.T4 = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CQUAD4* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CQUAD4* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CQUAD4* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CQUAD4*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение THETA_MCID
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            if (Real_flag == 1)
                                ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                            else
                                ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                            end
                            ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                        end
                                                
                        % Чтение ZOFFS
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                        end
                                                
                        % Пропуск пустого поля
                        
                        if (End_card_flag ~= 1)
                        
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end
                        
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T1
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T1 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T2
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T2 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T3
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T3 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T4
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T4 = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CQUAD4,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [CQUAD4%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CBAR
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BAR ')) % SMALL FIELD FORMAT
                
                Element_read_counter = Element_read_counter + 1;

                ELEMENTS{Element_read_counter}.card = 'CBAR';
                ELEMENTS{Element_read_counter}.ID = [];
                ELEMENTS{Element_read_counter}.Prop_ID = [];
                ELEMENTS{Element_read_counter}.GA = [];
                ELEMENTS{Element_read_counter}.GB = [];
                ELEMENTS{Element_read_counter}.G0 = [];
                ELEMENTS{Element_read_counter}.X1 = [];
                ELEMENTS{Element_read_counter}.X2 = [];
                ELEMENTS{Element_read_counter}.X3 = [];
                ELEMENTS{Element_read_counter}.OFFT = [];
                ELEMENTS{Element_read_counter}.PA = [];
                ELEMENTS{Element_read_counter}.PB = [];
                ELEMENTS{Element_read_counter}.W1A = [];
                ELEMENTS{Element_read_counter}.W2A = [];
                ELEMENTS{Element_read_counter}.W3A = [];
                ELEMENTS{Element_read_counter}.W1B = [];
                ELEMENTS{Element_read_counter}.W2B = [];
                ELEMENTS{Element_read_counter}.W3B = [];
                
                % Чтение ID
                if (length(string) < 16)
                    End_index = length(string);
                else
                    End_index = 16;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером элемента в карточке CBAR : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                ELEMENTS{Element_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CBAR %i !\n', ELEMENTS{Element_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'CBAR';
                Item_ID = ELEMENTS{Element_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 16;
                Record_length = 8;
                Next_string_large = 0;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение Prop_ID
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.Prop_ID = Read_Result;
                end
                
                % Чтение GA
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GA = Read_Result;
                end
                
                % Чтение GB
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GB = Read_Result;
                end
                
                % Чтение G0/X1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.X1 = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.G0 = Read_Result;
                    end
                end
                
                % Чтение X2
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X2 = Read_Result;
                end
                                
                % Чтение X3
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X3 = Read_Result;
                end
                                
                % Чтение OFFT
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.OFFT = Read_Result;
                end
                                
                % Чтение PA
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PA = Read_Result;
                    end
                
                end
                
                % Чтение PB
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PB = Read_Result;
                    end
                
                end
                
                % Чтение W1A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1A = Read_Result;
                    end
                
                end
                
                % Чтение W2A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2A = Read_Result;
                    end
                
                end
                
                % Чтение W3A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3A = Read_Result;
                    end
                
                end
                
                % Чтение W1B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1B = Read_Result;
                    end
                
                end
                
                % Чтение W2B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2B = Read_Result;
                    end
                
                end
                
                % Чтение W3B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3B = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BAR*')) % LARGE FIELD FORMAT
                
                Element_read_counter = Element_read_counter + 1;

                ELEMENTS{Element_read_counter}.card = 'CBAR';
                ELEMENTS{Element_read_counter}.ID = [];
                ELEMENTS{Element_read_counter}.Prop_ID = [];
                ELEMENTS{Element_read_counter}.GA = [];
                ELEMENTS{Element_read_counter}.GB = [];
                ELEMENTS{Element_read_counter}.G0 = [];
                ELEMENTS{Element_read_counter}.X1 = [];
                ELEMENTS{Element_read_counter}.X2 = [];
                ELEMENTS{Element_read_counter}.X3 = [];
                ELEMENTS{Element_read_counter}.OFFT = [];
                ELEMENTS{Element_read_counter}.PA = [];
                ELEMENTS{Element_read_counter}.PB = [];
                ELEMENTS{Element_read_counter}.W1A = [];
                ELEMENTS{Element_read_counter}.W2A = [];
                ELEMENTS{Element_read_counter}.W3A = [];
                ELEMENTS{Element_read_counter}.W1B = [];
                ELEMENTS{Element_read_counter}.W2B = [];
                ELEMENTS{Element_read_counter}.W3B = [];
                
                % Чтение ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером элемента в карточке CBAR* : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                ELEMENTS{Element_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CBAR* %i !\n', ELEMENTS{Element_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'CBAR*';
                Item_ID = ELEMENTS{Element_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 24;
                Record_length = 16;
                Next_string_large = 1;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение Prop_ID
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.Prop_ID = Read_Result;
                end
                
                % Чтение GA
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GA = Read_Result;
                end
                
                % Чтение GB
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GB = Read_Result;
                end
                
                % Чтение G0/X1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.X1 = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.G0 = Read_Result;
                    end
                end
                
                % Чтение X2
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X2 = Read_Result;
                end
                                
                % Чтение X3
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X3 = Read_Result;
                end
                                
                % Чтение OFFT
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.OFFT = Read_Result;
                end
                                
                % Чтение PA
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PA = Read_Result;
                    end
                
                end
                
                % Чтение PB
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PB = Read_Result;
                    end
                
                end
                
                % Чтение W1A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1A = Read_Result;
                    end
                
                end
                
                % Чтение W2A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2A = Read_Result;
                    end
                
                end
                
                % Чтение W3A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3A = Read_Result;
                    end
                
                end
                
                % Чтение W1B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1B = Read_Result;
                    end
                
                end
                
                % Чтение W2B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2B = Read_Result;
                    end
                
                end
                
                % Чтение W3B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3B = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение CHEXA (уникальное имя)
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'HEXA'))

                if (length(string) < 6)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 6 в карточке CHEXA [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(6)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CHEXA';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.N_nodes = 0;
                        ELEMENTS{Element_read_counter}.Nodes = zeros(20,1);
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CHEXA : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CHEXA %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CHEXA : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CHEXA';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение полей карточки
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.Nodes,1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки твердотельных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.N_nodes = ELEMENTS{Element_read_counter}.N_nodes + 1;
                                ELEMENTS{Element_read_counter}.Nodes(i) = Read_Result;
                            end
                            
							if (End_card_flag == 1)
							    break;
							end

                        end

                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (ELEMENTS{Element_read_counter}.N_nodes == 0)
                            fprintf (1, '\nНе найдено узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end
                        
                        ELEMENTS{Element_read_counter}.Nodes = ELEMENTS{Element_read_counter}.Nodes(1:ELEMENTS{Element_read_counter}.N_nodes);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CHEXA';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.N_nodes = 0;
                        ELEMENTS{Element_read_counter}.Nodes = zeros(20,1);
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CHEXA* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CHEXA* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CHEXA* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CHEXA*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение полей карточки
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.Nodes,1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки твердотельных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.N_nodes = ELEMENTS{Element_read_counter}.N_nodes + 1;
                                ELEMENTS{Element_read_counter}.Nodes(i) = Read_Result;
                            end
                            
							if (End_card_flag == 1)
							    break;
							end

                        end

                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (ELEMENTS{Element_read_counter}.N_nodes == 0)
                            fprintf (1, '\nНе найдено узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end
                        
                        ELEMENTS{Element_read_counter}.Nodes = ELEMENTS{Element_read_counter}.Nodes(1:ELEMENTS{Element_read_counter}.N_nodes);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CHEXA,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 6 в карточке [CHEXA%s] !\n', string(6));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CTRIA3 (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'TRIA3'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке CTRIA3 [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CTRIA3';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(3,1);
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CTRIA3 : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CTRIA3 %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CTRIA3 : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CTRIA3';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение THETA_MCID
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            if (Real_flag == 1)
                                ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                            else
                                ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                            end
                            ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                        end
                                                
                        % Чтение ZOFFS
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                        end
                                                
                        % Пропуск пустого поля
                                                
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end
                                                
                        % Пропуск пустого поля
                        
                        if (End_card_flag ~= 1)
                        
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end
                        
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T1
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T1 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T2
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T2 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T3
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T3 = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CTRIA3';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(3,1);
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CTRIA3* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CTRIA3* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CTRIA3* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CTRIA3*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение THETA_MCID
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            if (Real_flag == 1)
                                ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                            else
                                ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                            end
                            ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                        end
                                                
                        % Чтение ZOFFS
                                                
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                        end
                                                
                        % Пропуск пустого поля
                                                
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end
                                                
                        % Пропуск пустого поля
                        
                        if (End_card_flag ~= 1)
                        
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end
                        
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T1
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T1 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T2
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T2 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T3
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T3 = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CTRIA3,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [CTRIA3%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CBUSH
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BUSH ')) % SMALL FIELD FORMAT
                
                Element_read_counter = Element_read_counter + 1;

                ELEMENTS{Element_read_counter}.card = 'CBUSH';
                ELEMENTS{Element_read_counter}.ID = [];
                ELEMENTS{Element_read_counter}.Prop_ID = [];
                ELEMENTS{Element_read_counter}.GA = [];
                ELEMENTS{Element_read_counter}.GB = [];
                ELEMENTS{Element_read_counter}.GO = [];
                ELEMENTS{Element_read_counter}.X1 = [];
                ELEMENTS{Element_read_counter}.X2 = [];
                ELEMENTS{Element_read_counter}.X3 = [];
                ELEMENTS{Element_read_counter}.CID = [];
                ELEMENTS{Element_read_counter}.S = [];
                ELEMENTS{Element_read_counter}.OCID = [];
                ELEMENTS{Element_read_counter}.S1 = [];
                ELEMENTS{Element_read_counter}.S2 = [];
                ELEMENTS{Element_read_counter}.S3 = [];
                
                % Чтение ID
                if (length(string) < 16)
                    End_index = length(string);
                else
                    End_index = 16;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером элемента в карточке CBUSH : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                ELEMENTS{Element_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CBUSH %i !\n', ELEMENTS{Element_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'CBUSH';
                Item_ID = ELEMENTS{Element_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 16;
                Record_length = 8;
                Next_string_large = 0;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение Prop_ID
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск номера property set в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером property set в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером property set в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.Prop_ID = Read_Result;
                end
                
                % Чтение GA
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GA = Read_Result;
                end
                
                % Чтение GB

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.GB = Read_Result;
                end
                
                % Чтение GO/X1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.X1 = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.GO = Read_Result;
                    end
                end
                
                % Чтение X2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X2 = Read_Result;
                end
                
                % Чтение X3

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X3 = Read_Result;
                end
                
                % Чтение CID

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.CID = Read_Result;
                end
                
                % Чтение S
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S = Read_Result;
                    end
                
                end
                
                % Чтение OCID
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.OCID = Read_Result;
                    end
                
                end
                
                % Чтение S1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S1 = Read_Result;
                    end
                
                end
                
                % Чтение S2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S2 = Read_Result;
                    end
                
                end
                
                % Чтение S3
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S3 = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BUSH*')) % LARGE FIELD FORMAT
                
                Element_read_counter = Element_read_counter + 1;

                ELEMENTS{Element_read_counter}.card = 'CBUSH';
                ELEMENTS{Element_read_counter}.ID = [];
                ELEMENTS{Element_read_counter}.Prop_ID = [];
                ELEMENTS{Element_read_counter}.GA = [];
                ELEMENTS{Element_read_counter}.GB = [];
                ELEMENTS{Element_read_counter}.GO = [];
                ELEMENTS{Element_read_counter}.X1 = [];
                ELEMENTS{Element_read_counter}.X2 = [];
                ELEMENTS{Element_read_counter}.X3 = [];
                ELEMENTS{Element_read_counter}.CID = [];
                ELEMENTS{Element_read_counter}.S = [];
                ELEMENTS{Element_read_counter}.OCID = [];
                ELEMENTS{Element_read_counter}.S1 = [];
                ELEMENTS{Element_read_counter}.S2 = [];
                ELEMENTS{Element_read_counter}.S3 = [];
                
                % Чтение ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером элемента в карточке CBUSH* : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                ELEMENTS{Element_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CBUSH* %i !\n', ELEMENTS{Element_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'CBUSH*';
                Item_ID = ELEMENTS{Element_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 24;
                Record_length = 16;
                Next_string_large = 1;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение Prop_ID
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск номера property set в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером property set в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером property set в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.Prop_ID = Read_Result;
                end
                
                % Чтение GA
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GA = Read_Result;
                end
                
                % Чтение GB

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.GB = Read_Result;
                end
                
                % Чтение GO/X1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.X1 = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.GO = Read_Result;
                    end
                end
                
                % Чтение X2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X2 = Read_Result;
                end
                
                % Чтение X3

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X3 = Read_Result;
                end
                
                % Чтение CID

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.CID = Read_Result;
                end
                
                % Чтение S
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S = Read_Result;
                    end
                
                end
                
                % Чтение OCID
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.OCID = Read_Result;
                    end
                
                end
                
                % Чтение S1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S1 = Read_Result;
                    end
                
                end
                
                % Чтение S2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S2 = Read_Result;
                    end
                
                end
                
                % Чтение S3
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.S3 = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение CROD (уникальное имя)
            
            if ((length(string) >= 4) && strcmpi(string(2:4), 'ROD'))

                if (length(string) < 5)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 5 в карточке CROD [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(5)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;% ELEMENTS (карточка   CROD) | .card | .ID | .Prop_ID | .G1 | .G2 |
                        
                        ELEMENTS{Element_read_counter}.card = 'CROD';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G1 = [];
                        ELEMENTS{Element_read_counter}.G2 = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CROD : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CROD %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CROD %i : [%s] !\n', ELEMENTS{Element_read_counter}.ID, strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % Чтение G1
                        tmp_number = str2double(string(25:32));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером узла G1 в карточке CROD %i : [%s] !\n', ELEMENTS{Element_read_counter}.ID, strtrim(string(25:32)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.G1 = tmp_number;

                        % Чтение G2
                        if (length(string) < 40)
                            End_index = length(string);
                        else
                            End_index = 40;
                        end
                        tmp_number = str2double(string(33:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером узла G2 в карточке CROD %i : [%s] !\n', ELEMENTS{Element_read_counter}.ID, strtrim(string(33:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.G2 = tmp_number;
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CROD';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G1 = [];
                        ELEMENTS{Element_read_counter}.G2 = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CROD* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CROD* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CROD* %i : [%s] !\n', ELEMENTS{Element_read_counter}.ID, strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % Чтение G1
                        tmp_number = str2double(string(41:56));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером узла G1 в карточке CROD* %i : [%s] !\n', ELEMENTS{Element_read_counter}.ID, strtrim(string(41:56)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.G1 = tmp_number;

                        % Чтение G2
                        if (length(string) < 72)
                            End_index = length(string);
                        else
                            End_index = 72;
                        end
                        tmp_number = str2double(string(57:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером узла G2 в карточке CROD* %i : [%s] !\n', ELEMENTS{Element_read_counter}.ID, strtrim(string(57:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.G2 = tmp_number;
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CROD,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 5 в карточке [CROD%s] !\n', string(5));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CBEAM
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAM ')) % SMALL FIELD FORMAT
                
                Element_read_counter = Element_read_counter + 1;

                ELEMENTS{Element_read_counter}.card = 'CBEAM';
                ELEMENTS{Element_read_counter}.ID = [];
                ELEMENTS{Element_read_counter}.Prop_ID = [];
                ELEMENTS{Element_read_counter}.GA = [];
                ELEMENTS{Element_read_counter}.GB = [];
                ELEMENTS{Element_read_counter}.G0 = [];
                ELEMENTS{Element_read_counter}.X1 = [];
                ELEMENTS{Element_read_counter}.X2 = [];
                ELEMENTS{Element_read_counter}.X3 = [];
                ELEMENTS{Element_read_counter}.OFFT = [];
                ELEMENTS{Element_read_counter}.BIT = [];
                ELEMENTS{Element_read_counter}.PA = [];
                ELEMENTS{Element_read_counter}.PB = [];
                ELEMENTS{Element_read_counter}.W1A = [];
                ELEMENTS{Element_read_counter}.W2A = [];
                ELEMENTS{Element_read_counter}.W3A = [];
                ELEMENTS{Element_read_counter}.W1B = [];
                ELEMENTS{Element_read_counter}.W2B = [];
                ELEMENTS{Element_read_counter}.W3B = [];
                ELEMENTS{Element_read_counter}.SA = [];
                ELEMENTS{Element_read_counter}.SB = [];
                
                % Чтение ID
                if (length(string) < 16)
                    End_index = length(string);
                else
                    End_index = 16;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером элемента в карточке CBEAM : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                ELEMENTS{Element_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CBEAM %i !\n', ELEMENTS{Element_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'CBEAM';
                Item_ID = ELEMENTS{Element_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 16;
                Record_length = 8;
                Next_string_large = 0;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение Prop_ID
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.Prop_ID = Read_Result;
                end
                
                % Чтение GA
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GA = Read_Result;
                end
                
                % Чтение GB
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GB = Read_Result;
                end
                
                % Чтение G0/X1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.X1 = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.G0 = Read_Result;
                    end
                end
                
                % Чтение X2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X2 = Read_Result;
                end
                
                % Чтение X3

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X3 = Read_Result;
                end
                
                % Чтение OFFT/BIT

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_CRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                
                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.BIT = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.OFFT = Read_Result;
                    end
                end
                
                % Чтение PA
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PA = Read_Result;
                    end
                
                end
                
                % Чтение PB
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PB = Read_Result;
                    end
                
                end
                
                % Чтение W1A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1A = Read_Result;
                    end
                
                end
                
                % Чтение W2A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2A = Read_Result;
                    end
                
                end
                
                % Чтение W3A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3A = Read_Result;
                    end
                
                end
                
                % Чтение W1B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1B = Read_Result;
                    end
                
                end
                
                % Чтение W2B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2B = Read_Result;
                    end
                
                end
                
                % Чтение W3B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3B = Read_Result;
                    end
                
                end
                
                % Чтение SA
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.SA = Read_Result;
                    end
                
                end
                
                % Чтение SB
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.SB = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAM*')) % LARGE FIELD FORMAT
                
                Element_read_counter = Element_read_counter + 1;

                ELEMENTS{Element_read_counter}.card = 'CBEAM';
                ELEMENTS{Element_read_counter}.ID = [];
                ELEMENTS{Element_read_counter}.Prop_ID = [];
                ELEMENTS{Element_read_counter}.GA = [];
                ELEMENTS{Element_read_counter}.GB = [];
                ELEMENTS{Element_read_counter}.G0 = [];
                ELEMENTS{Element_read_counter}.X1 = [];
                ELEMENTS{Element_read_counter}.X2 = [];
                ELEMENTS{Element_read_counter}.X3 = [];
                ELEMENTS{Element_read_counter}.OFFT = [];
                ELEMENTS{Element_read_counter}.BIT = [];
                ELEMENTS{Element_read_counter}.PA = [];
                ELEMENTS{Element_read_counter}.PB = [];
                ELEMENTS{Element_read_counter}.W1A = [];
                ELEMENTS{Element_read_counter}.W2A = [];
                ELEMENTS{Element_read_counter}.W3A = [];
                ELEMENTS{Element_read_counter}.W1B = [];
                ELEMENTS{Element_read_counter}.W2B = [];
                ELEMENTS{Element_read_counter}.W3B = [];
                ELEMENTS{Element_read_counter}.SA = [];
                ELEMENTS{Element_read_counter}.SB = [];
                
                % Чтение ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером элемента в карточке CBEAM* : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                ELEMENTS{Element_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CBEAM* %i !\n', ELEMENTS{Element_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'CBEAM*';
                Item_ID = ELEMENTS{Element_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 24;
                Record_length = 16;
                Next_string_large = 1;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение Prop_ID
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.Prop_ID = Read_Result;
                end
                
                % Чтение GA
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GA в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GA = Read_Result;
                end
                
                % Чтение GB
                
                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode == -2)
                    fprintf (1, '\nПропуск узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode == -3)
                    fprintf (1, '\nНеправильная запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    return;
                end

                if (ErrCode < 0)
                    return;
                end

                if (isempty(Read_Result))
                    fprintf (1, '\nОтсутствует запись с номером узла GB в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                else
                    ELEMENTS{Element_read_counter}.GB = Read_Result;
                end
                
                % Чтение G0/X1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.X1 = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.G0 = Read_Result;
                    end
                end
                
                % Чтение X2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X2 = Read_Result;
                end
                
                % Чтение X3

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    ELEMENTS{Element_read_counter}.X3 = Read_Result;
                end
                
                % Чтение OFFT/BIT

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_CRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                
                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    if (Real_flag == 1)
                        ELEMENTS{Element_read_counter}.BIT = Read_Result;
                    else
                        ELEMENTS{Element_read_counter}.OFFT = Read_Result;
                    end
                end
                
                % Чтение PA
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PA = Read_Result;
                    end
                
                end
                
                % Чтение PB
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.PB = Read_Result;
                    end
                
                end
                
                % Чтение W1A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1A = Read_Result;
                    end
                
                end
                
                % Чтение W2A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2A = Read_Result;
                    end
                
                end
                
                % Чтение W3A
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3A = Read_Result;
                    end
                
                end
                
                % Чтение W1B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W1B = Read_Result;
                    end
                
                end
                
                % Чтение W2B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W2B = Read_Result;
                    end
                
                end
                
                % Чтение W3B
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.W3B = Read_Result;
                    end
                
                end
                
                % Чтение SA
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.SA = Read_Result;
                    end
                
                end
                
                % Чтение SB
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        ELEMENTS{Element_read_counter}.SB = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение CPENTA (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'PENTA'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке CPENTA [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CPENTA';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.N_nodes = 0;
                        ELEMENTS{Element_read_counter}.Nodes = zeros(15,1);
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CPENTA : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CPENTA %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CPENTA : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CPENTA';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение полей карточки
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.Nodes,1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки твердотельных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.N_nodes = ELEMENTS{Element_read_counter}.N_nodes + 1;
                                ELEMENTS{Element_read_counter}.Nodes(i) = Read_Result;
                            end
                            
							if (End_card_flag == 1)
							    break;
							end

                        end

                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (ELEMENTS{Element_read_counter}.N_nodes == 0)
                            fprintf (1, '\nНе найдено узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end
                        
                        ELEMENTS{Element_read_counter}.Nodes = ELEMENTS{Element_read_counter}.Nodes(1:ELEMENTS{Element_read_counter}.N_nodes);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CPENTA';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.N_nodes = 0;
                        ELEMENTS{Element_read_counter}.Nodes = zeros(15,1);
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CPENTA* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CPENTA* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CPENTA* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CPENTA*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение полей карточки
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.Nodes,1)

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки твердотельных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.N_nodes = ELEMENTS{Element_read_counter}.N_nodes + 1;
                                ELEMENTS{Element_read_counter}.Nodes(i) = Read_Result;
                            end
                            
							if (End_card_flag == 1)
							    break;
							end

                        end

                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (ELEMENTS{Element_read_counter}.N_nodes == 0)
                            fprintf (1, '\nНе найдено узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end
                        
                        ELEMENTS{Element_read_counter}.Nodes = ELEMENTS{Element_read_counter}.Nodes(1:ELEMENTS{Element_read_counter}.N_nodes);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CPENTA,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [CPENTA%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CQUAD8 (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'QUAD8'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке CQUAD8 [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CQUAD8';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(8,1);
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.T4 = [];
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CQUAD8 : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CQUAD8 %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CQUAD8 : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CQUAD8';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение T1
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T1 = Read_Result;
                        end
                        
                        % Чтение T2
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T2 = Read_Result;
                        end
                        
                        % Чтение T3
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T3 = Read_Result;
                        end
                        
                        % Чтение T4
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T4 = Read_Result;
                        end
                        
                        % Чтение THETA_MCID
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            if (Real_flag == 1)
                                ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                            else
                                ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                            end
                            ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                        end
                        
                        % Чтение ZOFFS
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                        end
                        
                        % Пропуск пустого поля
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CQUAD8';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(8,1);
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.T4 = [];
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CQUAD8* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CQUAD8* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CQUAD8* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CQUAD8*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение T1
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T1 = Read_Result;
                        end
                        
                        % Чтение T2
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T2 = Read_Result;
                        end
                        
                        % Чтение T3
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T3 = Read_Result;
                        end
                        
                        % Чтение T4
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.T4 = Read_Result;
                        end
                        
                        % Чтение THETA_MCID
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            if (Real_flag == 1)
                                ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                            else
                                ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                            end
                            ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                        end
                        
                        % Чтение ZOFFS
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                        end
                        
                        % Пропуск пустого поля
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CQUAD8,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [CQUAD8%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение CTRIA6 (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'TRIA6'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке CTRIA6 [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CTRIA6';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(6,1);
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CTRIA6 : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CTRIA6 %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(17:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CTRIA6 : [%s] !\n', strtrim(string(17:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CTRIA6';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение THETA_MCID
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                if (Real_flag == 1)
                                    ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                                else
                                    ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                                end
                                ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                            end
                        
                        end
                        
                        % Чтение ZOFFS
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T1
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T1 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T2
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T2 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T3
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T3 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        Element_read_counter = Element_read_counter + 1;
                        
                        ELEMENTS{Element_read_counter}.card = 'CTRIA6';
                        ELEMENTS{Element_read_counter}.ID = [];
                        ELEMENTS{Element_read_counter}.Prop_ID = [];
                        ELEMENTS{Element_read_counter}.G = zeros(6,1);
                        ELEMENTS{Element_read_counter}.THETA_MCID = [];
                        ELEMENTS{Element_read_counter}.ZOFFS = [];
                        ELEMENTS{Element_read_counter}.T1 = [];
                        ELEMENTS{Element_read_counter}.T2 = [];
                        ELEMENTS{Element_read_counter}.T3 = [];
                        ELEMENTS{Element_read_counter}.TFLAG = [];
                        ELEMENTS{Element_read_counter}.Ori_type = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером элемента в карточке CTRIA6* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.ID = tmp_number;
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки CTRIA6* %i !\n', ELEMENTS{Element_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Prop_ID
                        tmp_number = str2double(string(25:40));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке CTRIA6* : [%s] !\n', strtrim(string(25:40)));
                            ErrCode = -1;
                            return;
                        end
                        ELEMENTS{Element_read_counter}.Prop_ID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'CTRIA6*';
                        Item_ID = ELEMENTS{Element_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение G(:,1)
                        
                        for i=1:size(ELEMENTS{Element_read_counter}.G, 1)
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                            
                            if (ErrCode == -2)
                                fprintf (1, '\nПропуск узла в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                break;
                            end
                            
                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с номером одного из узлов в карточке %s (элемент %i) !\n', Card_name, Item_ID);
                                break;
                            end
                            
                            if (ErrCode < 0)
                                break;
                            end
                            
                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует поле G%i в карточке %s (элемент %i) !\n', i, Card_name, Item_ID);
                                fprintf (1, 'Карточки оболочечных элементов с пропусками узлов не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            else
                                ELEMENTS{Element_read_counter}.G(i) = Read_Result;
                            end
                            
                        end
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение THETA_MCID
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings, Real_flag] = Read_Field_IRB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                if (Real_flag == 1)
                                    ELEMENTS{Element_read_counter}.Ori_type = 'Angle';
                                else
                                    ELEMENTS{Element_read_counter}.Ori_type = 'CID';
                                end
                                ELEMENTS{Element_read_counter}.THETA_MCID = Read_Result;
                            end
                        
                        end
                        
                        % Чтение ZOFFS
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.ZOFFS = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T1
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T1 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T2
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T2 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение T3
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.T3 = Read_Result;
                            end
                        
                        end
                        
                        % Чтение TFLAG
                        
                        if (End_card_flag ~= 1)
                        
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                ELEMENTS{Element_read_counter}.TFLAG = Read_Result;
                            end
                        
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CTRIA6,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [CTRIA6%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BAR,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CBAR,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAM,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CBEAM,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BUSH,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [CBUSH,] !\n');
                ErrCode = -1;
                return; 

            end
            
        case {'P', 'p'}
            
            % Чтение PBUSH
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BUSH ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PBUSH';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.K = [];
                PSETS{PSET_read_counter}.B = [];
                PSETS{PSET_read_counter}.GE = [];
                PSETS{PSET_read_counter}.RCV = [];
                PSETS{PSET_read_counter}.M = [];
                
                % Чтение ID
                if (length(string) < 16)
                    End_index = length(string);
                else
                    End_index = 16;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PBUSH : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBUSH %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if (~((length(Previous_strings{1} ) >= 9) && strcmp(Previous_strings{1}(1:8), '$ Pset: ')))
                        if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                            if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                            end
                        end
                    end
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'PBUSH';
                Item_ID = PSETS{PSET_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 16;
                Record_length = 8;
                Next_string_large = 0;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Флаг первой строки
                First_string_flag = 1;
                
                for s=1:5
                    
                    % Пропуск пустого поля
                    if (First_string_flag == 0)
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        if (ErrCode < 0)
                            return;
                        end
                    end
                    
                    if (First_string_flag == 1)
                        First_string_flag = 0;
                    end
                    
                    % Чтение флага
                    Flag_name = [];
                
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (~isempty(Read_Result))
                        Flag_name = Read_Result;
                    end
                    
                    % Выделение памяти
                    if (~isempty(Flag_name))

                        switch upper(Flag_name)
                            case 'K'
                                PSETS{PSET_read_counter}.K = zeros(6,1);
                            case 'B'
                                PSETS{PSET_read_counter}.B = zeros(6,1);
                            case 'GE'
                                PSETS{PSET_read_counter}.GE = zeros(6,1);
                            case 'RCV'
                                PSETS{PSET_read_counter}.RCV.SA = [];
                                PSETS{PSET_read_counter}.RCV.ST = [];
                                PSETS{PSET_read_counter}.RCV.EA = [];
                                PSETS{PSET_read_counter}.RCV.ET = [];
                            case 'M'
                                % Память выделять не нужно
                            otherwise
                                fprintf (1, '\nНеизвестный флаг в карточке %s с номером %i !\n', Card_name, Item_ID);
                                ErrCode = -1;
                                return;
                        end
                    
                    end
                    
                    Results_array = cell(6,1);
                    
                    for t=1:6
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            break;
                        end
                        
                        Results_array{t} = Read_Result;
                        
                    end
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (~isempty(Flag_name))

                        switch upper(Flag_name)
                            case 'K'
                                for t=1:6
                                    if (~isempty(Results_array{t}))
                                        PSETS{PSET_read_counter}.K(t) = Results_array{t};
                                    end
                                end
                            case 'B'
                                for t=1:6
                                    if (~isempty(Results_array{t}))
                                        PSETS{PSET_read_counter}.B(t) = Results_array{t};
                                    end
                                end
                            case 'GE'
                                for t=1:6
                                    if (~isempty(Results_array{t}))
                                        PSETS{PSET_read_counter}.GE(t) = Results_array{t};
                                    end
                                end
                            case 'RCV'
                                if (~isempty(Results_array{1}))
                                    PSETS{PSET_read_counter}.RCV.SA = Results_array{1};
                                end
                                if (~isempty(Results_array{2}))
                                    PSETS{PSET_read_counter}.RCV.ST = Results_array{2};
                                end
                                if (~isempty(Results_array{3}))
                                    PSETS{PSET_read_counter}.RCV.EA = Results_array{3};
                                end
                                if (~isempty(Results_array{4}))
                                    PSETS{PSET_read_counter}.RCV.ET = Results_array{4};
                                end
                            case 'M'
                                if (~isempty(Results_array{1}))
                                    PSETS{PSET_read_counter}.M = Results_array{1};
                                end
                        end
                    
                    end

                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BUSH*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PBUSH';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.K = [];
                PSETS{PSET_read_counter}.B = [];
                PSETS{PSET_read_counter}.GE = [];
                PSETS{PSET_read_counter}.RCV = [];
                PSETS{PSET_read_counter}.M = [];
                
                % Чтение ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PBUSH* : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBUSH* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if (~((length(Previous_strings{1} ) >= 9) && strcmp(Previous_strings{1}(1:8), '$ Pset: ')))
                        if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                            if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                            end
                        end
                    end
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'PBUSH*';
                Item_ID = PSETS{PSET_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 24;
                Record_length = 16;
                Next_string_large = 1;
                Record_read_counter = 1; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Флаг первой строки
                First_string_flag = 1;
                
                for s=1:5
                    
                    % Пропуск пустого поля
                    if (First_string_flag == 0)
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        if (ErrCode < 0)
                            return;
                        end
                    end
                    
                    if (First_string_flag == 1)
                        First_string_flag = 0;
                    end
                    
                    % Чтение флага
                    Flag_name = [];
                
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (~isempty(Read_Result))
                        Flag_name = Read_Result;
                    end
                    
                    % Выделение памяти
                    if (~isempty(Flag_name))

                        switch upper(Flag_name)
                            case 'K'
                                PSETS{PSET_read_counter}.K = zeros(6,1);
                            case 'B'
                                PSETS{PSET_read_counter}.B = zeros(6,1);
                            case 'GE'
                                PSETS{PSET_read_counter}.GE = zeros(6,1);
                            case 'RCV'
                                PSETS{PSET_read_counter}.RCV.SA = [];
                                PSETS{PSET_read_counter}.RCV.ST = [];
                                PSETS{PSET_read_counter}.RCV.EA = [];
                                PSETS{PSET_read_counter}.RCV.ET = [];
                            case 'M'
                                % Память выделять не нужно
                            otherwise
                                fprintf (1, '\nНеизвестный флаг в карточке %s с номером %i !\n', Card_name, Item_ID);
                                ErrCode = -1;
                                return;
                        end
                    
                    end
                    
                    Results_array = cell(6,1);
                    
                    for t=1:6
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            break;
                        end
                        
                        Results_array{t} = Read_Result;
                        
                    end
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (~isempty(Flag_name))

                        switch upper(Flag_name)
                            case 'K'
                                for t=1:6
                                    if (~isempty(Results_array{t}))
                                        PSETS{PSET_read_counter}.K(t) = Results_array{t};
                                    end
                                end
                            case 'B'
                                for t=1:6
                                    if (~isempty(Results_array{t}))
                                        PSETS{PSET_read_counter}.B(t) = Results_array{t};
                                    end
                                end
                            case 'GE'
                                for t=1:6
                                    if (~isempty(Results_array{t}))
                                        PSETS{PSET_read_counter}.GE(t) = Results_array{t};
                                    end
                                end
                            case 'RCV'
                                if (~isempty(Results_array{1}))
                                    PSETS{PSET_read_counter}.RCV.SA = Results_array{1};
                                end
                                if (~isempty(Results_array{2}))
                                    PSETS{PSET_read_counter}.RCV.ST = Results_array{2};
                                end
                                if (~isempty(Results_array{3}))
                                    PSETS{PSET_read_counter}.RCV.EA = Results_array{3};
                                end
                                if (~isempty(Results_array{4}))
                                    PSETS{PSET_read_counter}.RCV.ET = Results_array{4};
                                end
                            case 'M'
                                if (~isempty(Results_array{1}))
                                    PSETS{PSET_read_counter}.M = Results_array{1};
                                end
                        end
                    
                    end

                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PSHELL
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'SHELL ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PSHELL';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID1 = [];
                PSETS{PSET_read_counter}.T = [];
                PSETS{PSET_read_counter}.MID2 = [];
                PSETS{PSET_read_counter}.I_ratio = [];
                PSETS{PSET_read_counter}.MID3 = [];
                PSETS{PSET_read_counter}.TS_T = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.Z1 = [];
                PSETS{PSET_read_counter}.Z2 = [];
                PSETS{PSET_read_counter}.MID4 = [];
                
                % Чтение ID
                if (length(string) < 16)
                    End_index = length(string);
                else
                    End_index = 16;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PSHELL : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PSHELL %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID1
                if (length(Trim_CR_LF(string)) > 16)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    if (~isnan(str2double(string(17:End_index))))
                        PSETS{PSET_read_counter}.MID1 = str2double(string(17:End_index));
                    end
                end
                
                % Чтение T
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 32)
                        End_index = length(string);
                    else
                        End_index = 32;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.T = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.T = tmp_number;
                    end
                end
                
                % Чтение MID2
                if (length(Trim_CR_LF(string)) > 32)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    if (~isnan(str2double(string(33:End_index))))
                        PSETS{PSET_read_counter}.MID2 = str2double(string(33:End_index));
                    end
                end
                
                % Чтение I_ratio
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 48)
                        End_index = length(string);
                    else
                        End_index = 48;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.I_ratio = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.I_ratio = tmp_number;
                    end
                end
                
                % Чтение MID3
                if (length(Trim_CR_LF(string)) > 48)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    if (~isnan(str2double(string(49:End_index))))
                        PSETS{PSET_read_counter}.MID3 = str2double(string(49:End_index));
                    end
                end
                
                % Чтение TS_T
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 64)
                        End_index = length(string);
                    else
                        End_index = 64;
                    end
                    tmp_number = str2double(string(57:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.TS_T = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.TS_T = tmp_number;
                    end
                end
                
                % Чтение NSM
                if (length(Trim_CR_LF(string)) > 64)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    tmp_number = str2double(string(65:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(65:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.NSM = tmp_number;
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    
                    % Для вывода прогресса
                    Counter = Counter + 1;
                    Counter_2 = Counter_2 + 1;
                    if (Counter_2 == N_rec_segm)
                        Counter_2 = 0;
                        Written_count = Written_count + 1;
                        if (Written_count < Time_segments)
                            fprintf (1, '#');
                            pause (Progress_Bar_Delay);
                        end
                    end


                    continue;
                
                end
                
                % Чтение следующей строки с бэкапом
                N_prev_str = size(Previous_strings,1);
                string_backup = Previous_strings{N_prev_str};
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);
                
                % Проверка строки
                if (~((string(1) == '*') || (string(1) == ' ') || (string(1) == '+')))
                    
                    % Откат назад
                    fseek(Fin, -length(string), 'cof');
                    N_prev_str = size(Previous_strings,1);
                    string = Previous_strings{1};
                    for p=1:N_prev_str-1
                        Previous_strings{p} = Previous_strings{p+1};
                    end
                    Previous_strings{N_prev_str} = string_backup;
                    
                else
                    
                    % Проверка на записи в 10-ом поле
                    if (deblank(string) > 72)
                        fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PSHELL %i !\n', PSETS{PSET_read_counter}.ID);
                        fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                    
                    if (string(1) == '*')

                        % Вторая строка формата LARGE FIELD FORMAT

                        % Чтение Z1
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 24)
                                End_index = length(string);
                            else
                                End_index = 24;
                            end
                            tmp_number = str2double(string(9:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(9:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z1 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z1 = tmp_number;
                            end
                        end
                        
                        % Чтение Z2
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 40)
                                End_index = length(string);
                            else
                                End_index = 40;
                            end
                            tmp_number = str2double(string(25:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z2 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z2 = tmp_number;
                            end
                        end
                        
                        % Чтение MID4
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            if (~isnan(str2double(string(41:End_index))))
                                PSETS{PSET_read_counter}.MID4 = str2double(string(41:End_index));
                            end
                        end

                    else

                        % Вторая строка формата SMALL FIELD FORMAT

                        % Чтение Z1
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 16)
                                End_index = length(string);
                            else
                                End_index = 16;
                            end
                            tmp_number = str2double(string(9:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(9:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z1 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z1 = tmp_number;
                            end
                        end
                        
                        % Чтение Z2
                        if (length(Trim_CR_LF(string)) > 16)
                            if (length(string) < 24)
                                End_index = length(string);
                            else
                                End_index = 24;
                            end
                            tmp_number = str2double(string(17:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(17:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z2 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z2 = tmp_number;
                            end
                        end
                        
                        % Чтение MID4
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 32)
                                End_index = length(string);
                            else
                                End_index = 32;
                            end
                            if (~isnan(str2double(string(25:End_index))))
                                PSETS{PSET_read_counter}.MID4 = str2double(string(25:End_index));
                            end
                        end

                    end
                    
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'SHELL*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PSHELL';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID1 = [];
                PSETS{PSET_read_counter}.T = [];
                PSETS{PSET_read_counter}.MID2 = [];
                PSETS{PSET_read_counter}.I_ratio = [];
                PSETS{PSET_read_counter}.MID3 = [];
                PSETS{PSET_read_counter}.TS_T = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.Z1 = [];
                PSETS{PSET_read_counter}.Z2 = [];
                PSETS{PSET_read_counter}.MID4 = [];
                
                % Чтение ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PSHELL* : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PSHELL* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID1
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    if (~isnan(str2double(string(25:End_index))))
                        PSETS{PSET_read_counter}.MID1 = str2double(string(25:End_index));
                    end
                end
                
                % Чтение T
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.T = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.T = tmp_number;
                    end
                end
                
                % Чтение MID2
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    if (~isnan(str2double(string(57:End_index))))
                        PSETS{PSET_read_counter}.MID2 = str2double(string(57:End_index));
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    fprintf (1, '\nНеожиданный конец файла во время чтения карточки PSHELL* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    ErrCode = -1;
                    return;
                end
                
                % Чтение следующей строки
                N_prev_str = size(Previous_strings,1);
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);
                
                % Проверка строки
                if (string(1) ~= '*')
                    fprintf (1, '\nВторая строка в карточке PSHELL* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                    ErrCode = -1;
                    return;
                end
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PSHELL* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение I_ratio
                if (length(Trim_CR_LF(string)) > 8)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    tmp_number = str2double(string(9:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(9:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.I_ratio = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.I_ratio = tmp_number;
                    end
                end
                
                % Чтение MID3
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    if (~isnan(str2double(string(25:End_index))))
                        PSETS{PSET_read_counter}.MID3 = str2double(string(25:End_index));
                    end
                end
                
                % Чтение TS_T
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.TS_T = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.TS_T = tmp_number;
                    end
                end
                
                % Чтение NSM
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    tmp_number = str2double(string(57:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.NSM = tmp_number;
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    
                    % Для вывода прогресса
                    Counter = Counter + 1;
                    Counter_2 = Counter_2 + 1;
                    if (Counter_2 == N_rec_segm)
                        Counter_2 = 0;
                        Written_count = Written_count + 1;
                        if (Written_count < Time_segments)
                            fprintf (1, '#');
                            pause (Progress_Bar_Delay);
                        end
                    end


                    continue;
                    
                end
                
                % Чтение следующей строки с бэкапом
                N_prev_str = size(Previous_strings,1);
                string_backup = Previous_strings{N_prev_str};
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);
                
                % Проверка строки
                if (~((string(1) == '*') || (string(1) == ' ') || (string(1) == '+')))
                    
                    % Откат назад
                    fseek(Fin, -length(string), 'cof');
                    N_prev_str = size(Previous_strings,1);
                    string = Previous_strings{1};
                    for p=1:N_prev_str-1
                        Previous_strings{p} = Previous_strings{p+1};
                    end
                    Previous_strings{N_prev_str} = string_backup;
                    
                else
                    
                    % Проверка на записи в 10-ом поле
                    if (deblank(string) > 72)
                        fprintf (1, '\nОбнаружена запись в поле 10 третьей строки карточки PSHELL* %i !\n', PSETS{PSET_read_counter}.ID);
                        fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                    
                    if (string(1) == '*')

                        % Третья строка формата LARGE FIELD FORMAT

                        % Чтение Z1
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 24)
                                End_index = length(string);
                            else
                                End_index = 24;
                            end
                            tmp_number = str2double(string(9:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(9:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z1 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z1 = tmp_number;
                            end
                        end
                        
                        % Чтение Z2
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 40)
                                End_index = length(string);
                            else
                                End_index = 40;
                            end
                            tmp_number = str2double(string(25:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z2 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z2 = tmp_number;
                            end
                        end
                        
                        % Чтение MID4
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            if (~isnan(str2double(string(41:End_index))))
                                PSETS{PSET_read_counter}.MID4 = str2double(string(41:End_index));
                            end
                        end

                    else

                        % Третья строка формата SMALL FIELD FORMAT

                        % Чтение Z1
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 16)
                                End_index = length(string);
                            else
                                End_index = 16;
                            end
                            tmp_number = str2double(string(9:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(9:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z1 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z1 = tmp_number;
                            end
                        end
                        
                        % Чтение Z2
                        if (length(Trim_CR_LF(string)) > 16)
                            if (length(string) < 24)
                                End_index = length(string);
                            else
                                End_index = 24;
                            end
                            tmp_number = str2double(string(17:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(17:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z2 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z2 = tmp_number;
                            end
                        end
                        
                        % Чтение MID4
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 32)
                                End_index = length(string);
                            else
                                End_index = 32;
                            end
                            if (~isnan(str2double(string(25:End_index))))
                                PSETS{PSET_read_counter}.MID4 = str2double(string(25:End_index));
                            end
                        end

                    end
                    
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PBAR
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BAR ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PBAR';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID = [];
                PSETS{PSET_read_counter}.A = [];
                PSETS{PSET_read_counter}.I1 = [];
                PSETS{PSET_read_counter}.I2 = [];
                PSETS{PSET_read_counter}.J = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.C1 = [];
                PSETS{PSET_read_counter}.C2 = [];
                PSETS{PSET_read_counter}.D1 = [];
                PSETS{PSET_read_counter}.D2 = [];
                PSETS{PSET_read_counter}.E1 = [];
                PSETS{PSET_read_counter}.E2 = [];
                PSETS{PSET_read_counter}.F1 = [];
                PSETS{PSET_read_counter}.F2 = [];
                PSETS{PSET_read_counter}.K1 = [];
                PSETS{PSET_read_counter}.K2 = [];
                PSETS{PSET_read_counter}.I12 = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PBAR : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBAR %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID
                if (length(Trim_CR_LF(string)) > 16)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    tmp_number = str2double(string(17:End_index));
                    if (isnan(tmp_number))
                        fprintf (1, '\nНеправильная запись с полем MID в карточке PBAR с номером %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                        ErrCode = -1;
                        return;
                    end
                    PSETS{PSET_read_counter}.MID = tmp_number;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'PBAR';
                Item_ID = PSETS{PSET_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 24;
                Record_length = 8;
                Next_string_large = 0;
                Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.A = Read_Result;
                end
                
                % Чтение I1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I1 = Read_Result;
                end
                
                % Чтение I2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I2 = Read_Result;
                end
                
                % Чтение J

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.J = Read_Result;
                end
                
                % Чтение NSM

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSM = Read_Result;
                end
                
                % Пропуск пустого поля
                [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end
                
                % Чтение C1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C1 = Read_Result;
                    end
                
                end
                
                % Чтение C2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C2 = Read_Result;
                    end
                
                end
                
                % Чтение D1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D1 = Read_Result;
                    end
                
                end
                
                % Чтение D2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D2 = Read_Result;
                    end
                
                end
                
                % Чтение E1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E1 = Read_Result;
                    end
                
                end
                
                % Чтение E2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E2 = Read_Result;
                    end
                
                end
                
                % Чтение F1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F1 = Read_Result;
                    end
                
                end
                
                % Чтение F2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F2 = Read_Result;
                    end
                
                end
                
                % Чтение K1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.K1 = Read_Result;
                    end
                
                end
                
                % Чтение K2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.K2 = Read_Result;
                    end
                
                end
                
                % Чтение I12
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.I12 = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BAR*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PBAR';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID = [];
                PSETS{PSET_read_counter}.A = [];
                PSETS{PSET_read_counter}.I1 = [];
                PSETS{PSET_read_counter}.I2 = [];
                PSETS{PSET_read_counter}.J = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.C1 = [];
                PSETS{PSET_read_counter}.C2 = [];
                PSETS{PSET_read_counter}.D1 = [];
                PSETS{PSET_read_counter}.D2 = [];
                PSETS{PSET_read_counter}.E1 = [];
                PSETS{PSET_read_counter}.E2 = [];
                PSETS{PSET_read_counter}.F1 = [];
                PSETS{PSET_read_counter}.F2 = [];
                PSETS{PSET_read_counter}.K1 = [];
                PSETS{PSET_read_counter}.K2 = [];
                PSETS{PSET_read_counter}.I12 = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PBAR* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBAR* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        fprintf (1, '\nНеправильная запись с полем MID в карточке PBAR* с номером %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                        ErrCode = -1;
                        return;
                    end
                    PSETS{PSET_read_counter}.MID = tmp_number;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'PBAR*';
                Item_ID = PSETS{PSET_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 40;
                Record_length = 16;
                Next_string_large = 1;
                Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.A = Read_Result;
                end
                
                % Чтение I1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I1 = Read_Result;
                end
                
                % Чтение I2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I2 = Read_Result;
                end
                
                % Чтение J

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.J = Read_Result;
                end
                
                % Чтение NSM

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSM = Read_Result;
                end
                
                % Пропуск пустого поля
                [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end
                
                % Чтение C1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C1 = Read_Result;
                    end
                
                end
                
                % Чтение C2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C2 = Read_Result;
                    end
                
                end
                
                % Чтение D1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D1 = Read_Result;
                    end
                
                end
                
                % Чтение D2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D2 = Read_Result;
                    end
                
                end
                
                % Чтение E1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E1 = Read_Result;
                    end
                
                end
                
                % Чтение E2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E2 = Read_Result;
                    end
                
                end
                
                % Чтение F1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F1 = Read_Result;
                    end
                
                end
                
                % Чтение F2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F2 = Read_Result;
                    end
                
                end
                
                % Чтение K1
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.K1 = Read_Result;
                    end
                
                end
                
                % Чтение K2
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.K2 = Read_Result;
                    end
                
                end
                
                % Чтение I12
                
                if (End_card_flag ~= 1)

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.I12 = Read_Result;
                    end
                
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PBARL (уникальное имя)
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BARL'))

                if (length(string) < 6)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 6 в карточке PBARL [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(6)

                    case ' ' % SMALL FIELD FORMAT

                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBARL';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.GROUP = [];
                        PSETS{PSET_read_counter}.TYPE = [];
                        PSETS{PSET_read_counter}.DIM = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBARL : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBARL %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 24)
                            End_index = length(string);
                        else
                            End_index = 24;
                        end
                        tmp_number = str2double(string(17:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBARL %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'PBARL';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение GROUP

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.GROUP = Read_Result;
                        end
                        
                        % Чтение TYPE
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_C(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.TYPE = Read_Result;
                        
                        % Выделение памяти
                        
                        switch upper(PSETS{PSET_read_counter}.TYPE)
                            
                            case 'ROD'
                                N_dim = 1;
                            case 'TUBE'
                                N_dim = 2;
                            case 'TUBE2'
                                N_dim = 2;
                            case 'L'
                                N_dim = 4;
                            case 'I'
                                N_dim = 6;
                            case 'CHAN'
                                N_dim = 4;
                            case 'T'
                                N_dim = 4;
                            case 'BOX'
                                N_dim = 4;
                            case 'BAR'
                                N_dim = 2;
                            case 'CROSS'
                                N_dim = 4;
                            case 'H'
                                N_dim = 4;
                            case 'T1'
                                N_dim = 4;
                            case 'I1'
                                N_dim = 4;
                            case 'CHAN1'
                                N_dim = 4;
                            case 'Z'
                                N_dim = 4;
                            case 'CHAN2'
                                N_dim = 4;
                            case 'T2'
                                N_dim = 4;
                            case 'BOX1'
                                N_dim = 6;
                            case 'HEXA'
                                N_dim = 3;
                            case 'HAT'
                                N_dim = 4;
                            case 'HAT1'
                                N_dim = 5;
                            case 'DBOX'
                                N_dim = 10;
                            otherwise
                                fprintf (1, '\nНеизвестныя запись с полем TYPE в карточке %s с номером %i: [%s] !\n', Card_name, Item_ID, PSETS{PSET_read_counter}.TYPE);
                                ErrCode = -1;
                                return;
                            
                        end
                        
                        PSETS{PSET_read_counter}.DIM = zeros(N_dim,1);
                        
                        % Перевод на следующую строку
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (End_card_flag == 1)
                            break;
                        end
                        
                        % Чтение DIM
                        
                        for k=1:N_dim
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.DIM(k) = Read_Result;
                            
                        end
                        
                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.NSM = Read_Result;
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;
                        
                    case '*' % LARGE FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBARL';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.GROUP = [];
                        PSETS{PSET_read_counter}.TYPE = [];
                        PSETS{PSET_read_counter}.DIM = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBARL* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBARL* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 40)
                            End_index = length(string);
                        else
                            End_index = 40;
                        end
                        tmp_number = str2double(string(25:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBARL* %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'PBARL*';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение GROUP

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.GROUP = Read_Result;
                        end
                        
                        % Чтение TYPE
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_C(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.TYPE = Read_Result;
                        
                        % Выделение памяти
                        
                        switch upper(PSETS{PSET_read_counter}.TYPE)
                            
                            case 'ROD'
                                N_dim = 1;
                            case 'TUBE'
                                N_dim = 2;
                            case 'TUBE2'
                                N_dim = 2;
                            case 'L'
                                N_dim = 4;
                            case 'I'
                                N_dim = 6;
                            case 'CHAN'
                                N_dim = 4;
                            case 'T'
                                N_dim = 4;
                            case 'BOX'
                                N_dim = 4;
                            case 'BAR'
                                N_dim = 2;
                            case 'CROSS'
                                N_dim = 4;
                            case 'H'
                                N_dim = 4;
                            case 'T1'
                                N_dim = 4;
                            case 'I1'
                                N_dim = 4;
                            case 'CHAN1'
                                N_dim = 4;
                            case 'Z'
                                N_dim = 4;
                            case 'CHAN2'
                                N_dim = 4;
                            case 'T2'
                                N_dim = 4;
                            case 'BOX1'
                                N_dim = 6;
                            case 'HEXA'
                                N_dim = 3;
                            case 'HAT'
                                N_dim = 4;
                            case 'HAT1'
                                N_dim = 5;
                            case 'DBOX'
                                N_dim = 10;
                            otherwise
                                fprintf (1, '\nНеизвестныя запись с полем TYPE в карточке %s с номером %i: [%s] !\n', Card_name, Item_ID, PSETS{PSET_read_counter}.TYPE);
                                ErrCode = -1;
                                return;
                            
                        end
                        
                        PSETS{PSET_read_counter}.DIM = zeros(N_dim,1);
                        
                        % Перевод на следующую строку
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (End_card_flag == 1)
                            break;
                        end
                        
                        % Чтение DIM
                        
                        for k=1:N_dim
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.DIM(k) = Read_Result;
                            
                        end
                        
                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.NSM = Read_Result;
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBARL,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 6 в карточке [PBARL%s] !\n', string(6));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение PROD
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'ROD ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PROD';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID = [];
                PSETS{PSET_read_counter}.A = [];
                PSETS{PSET_read_counter}.J = [];
                PSETS{PSET_read_counter}.C = [];
                PSETS{PSET_read_counter}.NSM = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PROD : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PROD %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(17:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с полем MID в карточке PROD %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.MID = tmp_number;
                
                % Чтение A
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 32)
                        End_index = length(string);
                    else
                        End_index = 32;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.A = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.A = tmp_number;
                    end
                end
                
                % Чтение J
                if (length(Trim_CR_LF(string)) > 32)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(33:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(33:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.J = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.J = tmp_number;
                    end
                end
                
                % Чтение C
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 48)
                        End_index = length(string);
                    else
                        End_index = 48;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.C = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.C = tmp_number;
                    end
                end
                
                % Чтение NSM
                if (length(Trim_CR_LF(string)) > 48)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(49:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(49:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.NSM = tmp_number;
                    end
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'ROD*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PROD';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID = [];
                PSETS{PSET_read_counter}.A = [];
                PSETS{PSET_read_counter}.J = [];
                PSETS{PSET_read_counter}.C = [];
                PSETS{PSET_read_counter}.NSM = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PROD* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PROD* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID
                if (length(string) < 40)
                    End_index = length(string);
                else
                    End_index = 40;
                end
                tmp_number = str2double(string(25:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с полем MID в карточке PROD* %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.MID = tmp_number;
                
                % Чтение A
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.A = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.A = tmp_number;
                    end
                end
                
                % Чтение J
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    tmp_number = str2double(string(57:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.J = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.J = tmp_number;
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    
                    % Для вывода прогресса
                    Counter = Counter + 1;
                    Counter_2 = Counter_2 + 1;
                    if (Counter_2 == N_rec_segm)
                        Counter_2 = 0;
                        Written_count = Written_count + 1;
                        if (Written_count < Time_segments)
                            fprintf (1, '#');
                            pause (Progress_Bar_Delay);
                        end
                    end


                    continue;
                    
                end
                
                % Чтение следующей строки
                N_prev_str = size(Previous_strings,1);
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);
                
                % Проверка строки
                if (string(1) ~= '*')
                    fprintf (1, '\nВторая строка в карточке PROD* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                    ErrCode = -1;
                    return;
                end
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PROD* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение C
                if (length(Trim_CR_LF(string)) > 8)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    tmp_number = str2double(string(9:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(9:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.C = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.C = tmp_number;
                    end
                end
                
                % Чтение NSM
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.NSM = tmp_number;
                    end
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PBEAM
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAM ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PBEAM';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID = [];
                PSETS{PSET_read_counter}.A = [];
                PSETS{PSET_read_counter}.I1 = [];
                PSETS{PSET_read_counter}.I2 = [];
                PSETS{PSET_read_counter}.I12 = [];
                PSETS{PSET_read_counter}.J = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.C1 = [];
                PSETS{PSET_read_counter}.C2 = [];
                PSETS{PSET_read_counter}.D1 = [];
                PSETS{PSET_read_counter}.D2 = [];
                PSETS{PSET_read_counter}.E1 = [];
                PSETS{PSET_read_counter}.E2 = [];
                PSETS{PSET_read_counter}.F1 = [];
                PSETS{PSET_read_counter}.F2 = [];
                PSETS{PSET_read_counter}.N_intermediate_states = 0;
                PSETS{PSET_read_counter}.Intermediate_states_data = [];
                PSETS{PSET_read_counter}.K1 = [];
                PSETS{PSET_read_counter}.K2 = [];
                PSETS{PSET_read_counter}.S1 = [];
                PSETS{PSET_read_counter}.S2 = [];
                PSETS{PSET_read_counter}.NSI_A = [];
                PSETS{PSET_read_counter}.NSI_B = [];
                PSETS{PSET_read_counter}.CW_A = [];
                PSETS{PSET_read_counter}.CW_B = [];
                PSETS{PSET_read_counter}.M1_A = [];
                PSETS{PSET_read_counter}.M2_A = [];
                PSETS{PSET_read_counter}.M1_B = [];
                PSETS{PSET_read_counter}.M2_B = [];
                PSETS{PSET_read_counter}.N1_A = [];
                PSETS{PSET_read_counter}.N2_A = [];
                PSETS{PSET_read_counter}.N1_B = [];
                PSETS{PSET_read_counter}.N2_B = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PBEAM : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBEAM %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID
                if (length(Trim_CR_LF(string)) > 16)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    tmp_number = str2double(string(17:End_index));
                    if (isnan(tmp_number))
                        fprintf (1, '\nНеправильная запись с полем MID в карточке PBEAM с номером %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                        ErrCode = -1;
                        return;
                    end
                    PSETS{PSET_read_counter}.MID = tmp_number;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'PBEAM';
                Item_ID = PSETS{PSET_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 24;
                Record_length = 8;
                Next_string_large = 0;
                Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.A = Read_Result;
                end
                
                % Чтение I1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I1 = Read_Result;
                end
                
                % Чтение I2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I2 = Read_Result;
                end
                
                % Чтение I12

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I12 = Read_Result;
                end
                
                % Чтение J

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.J = Read_Result;
                end
                
                % Чтение NSM

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSM = Read_Result;
                end
                
                % Проверка следующего значения: C1 или SO (вместо C1 сразу может быть строка SO)
                
                [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string);
                
                if ((isempty(Read_Result)) || ((~isempty(Read_Result)) && strcmp(Result_type, 'REAL')))
                    
                    % Чтение C1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C1 = Read_Result;
                    end

                    % Чтение C2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C2 = Read_Result;
                    end

                    % Чтение D1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D1 = Read_Result;
                    end

                    % Чтение D2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D2 = Read_Result;
                    end

                    % Чтение E1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E1 = Read_Result;
                    end

                    % Чтение E2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E2 = Read_Result;
                    end

                    % Чтение F1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F1 = Read_Result;
                    end

                    % Чтение F2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F2 = Read_Result;
                    end
                    
                end
                
                % Проверка следующего значения на присутствие SO
                
                [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string);
                
                if ((~isempty(Read_Result)) && strcmp(Result_type, 'CHAR'))
                    
                    PSETS{PSET_read_counter}.Intermediate_states_data = cell(N_pbeam_int_states_preallocated,1);
                                        
                    while(1)
                        
                        PSETS{PSET_read_counter}.N_intermediate_states = PSETS{PSET_read_counter}.N_intermediate_states + 1;
                        
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.A = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I12 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.J = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F2 = [];
                        
                        % Чтение SO
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_C(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем SO в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем SO в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = Read_Result;
                        
                        % Чтение X_XB
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем X/XB в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode == -3)
                            fprintf (1, '\nНеправильная запись с полем X/XB в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем X/XB в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = Read_Result;
                        
                        % Чтение A

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.A = Read_Result;
                        end

                        % Чтение I1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I1 = Read_Result;
                        end

                        % Чтение I2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I2 = Read_Result;
                        end

                        % Чтение I12

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I12 = Read_Result;
                        end

                        % Чтение J

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.J = Read_Result;
                        end

                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = Read_Result;
                        end
                        
                        % Чтение второй строки, только если SO=YES
                        
                        if (strcmpi(PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO, 'YES'))
                            
                            % Чтение C1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C1 = Read_Result;
                            end

                            % Чтение C2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C2 = Read_Result;
                            end

                            % Чтение D1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D1 = Read_Result;
                            end

                            % Чтение D2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D2 = Read_Result;
                            end

                            % Чтение E1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E1 = Read_Result;
                            end

                            % Чтение E2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E2 = Read_Result;
                            end

                            % Чтение F1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F1 = Read_Result;
                            end

                            % Чтение F2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F2 = Read_Result;
                            end
                            
                        end
                        
                        % Если конец карточки, то выходим из цикла
                        
                        if (End_card_flag == 1)
                            break;
                        end
                        
                        % Если следующее поле не CHAR, то выходим из цикла
                        
                        [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string);

                        if ((isempty(Read_Result)) || ((~isempty(Read_Result)) && strcmp(Result_type, 'REAL')))
                            break;
                        end

                    end
                    
                end
                
                % Чтение K1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.K1 = Read_Result;
                end
                
                % Чтение K2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.K2 = Read_Result;
                end
                
                % Чтение S1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.S1 = Read_Result;
                end
                
                % Чтение S2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.S2 = Read_Result;
                end

                % Чтение NSI_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSI_A = Read_Result;
                end
                
                % Чтение NSI_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSI_B = Read_Result;
                end
                
                % Чтение CW_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.CW_A = Read_Result;
                end
                
                % Чтение CW_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.CW_B = Read_Result;
                end
                
                % Чтение M1_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M1_A = Read_Result;
                end
                
                % Чтение M2_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M2_A = Read_Result;
                end
                
                % Чтение M1_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M1_B = Read_Result;
                end
                
                % Чтение M2_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M2_B = Read_Result;
                end
                
                % Чтение N1_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N1_A = Read_Result;
                end
                
                % Чтение N2_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N2_A = Read_Result;
                end
                
                % Чтение N1_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N1_B = Read_Result;
                end
                
                % Чтение N2_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N2_B = Read_Result;
                end
                
                % финализация массива ячеек Intermediate_states_data
                if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                    PSETS{PSET_read_counter}.Intermediate_states_data = PSETS{PSET_read_counter}.Intermediate_states_data(1:PSETS{PSET_read_counter}.N_intermediate_states);
                end
                
                % Сортировка массива ячеек Intermediate_states_data по возрастанию параметра X_XB
                if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                    tmp_array = zeros(PSETS{PSET_read_counter}.N_intermediate_states,2);
                    for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                        tmp_array(k,1) = PSETS{PSET_read_counter}.Intermediate_states_data{k}.X_XB;
                        tmp_array(k,2) = k;
                    end
                    tmp_array = sortrows(tmp_array, 1);
                    tmp_cell_array = cell(PSETS{PSET_read_counter}.N_intermediate_states,1);
                    for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                        tmp_cell_array(k) = PSETS{PSET_read_counter}.Intermediate_states_data(tmp_array(k,2));
                    end
                    PSETS{PSET_read_counter}.Intermediate_states_data = tmp_cell_array;
                end
                    
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAM*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PBEAM';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.MID = [];
                PSETS{PSET_read_counter}.A = [];
                PSETS{PSET_read_counter}.I1 = [];
                PSETS{PSET_read_counter}.I2 = [];
                PSETS{PSET_read_counter}.I12 = [];
                PSETS{PSET_read_counter}.J = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.C1 = [];
                PSETS{PSET_read_counter}.C2 = [];
                PSETS{PSET_read_counter}.D1 = [];
                PSETS{PSET_read_counter}.D2 = [];
                PSETS{PSET_read_counter}.E1 = [];
                PSETS{PSET_read_counter}.E2 = [];
                PSETS{PSET_read_counter}.F1 = [];
                PSETS{PSET_read_counter}.F2 = [];
                PSETS{PSET_read_counter}.N_intermediate_states = 0;
                PSETS{PSET_read_counter}.Intermediate_states_data = [];
                PSETS{PSET_read_counter}.K1 = [];
                PSETS{PSET_read_counter}.K2 = [];
                PSETS{PSET_read_counter}.S1 = [];
                PSETS{PSET_read_counter}.S2 = [];
                PSETS{PSET_read_counter}.NSI_A = [];
                PSETS{PSET_read_counter}.NSI_B = [];
                PSETS{PSET_read_counter}.CW_A = [];
                PSETS{PSET_read_counter}.CW_B = [];
                PSETS{PSET_read_counter}.M1_A = [];
                PSETS{PSET_read_counter}.M2_A = [];
                PSETS{PSET_read_counter}.M1_B = [];
                PSETS{PSET_read_counter}.M2_B = [];
                PSETS{PSET_read_counter}.N1_A = [];
                PSETS{PSET_read_counter}.N2_A = [];
                PSETS{PSET_read_counter}.N1_B = [];
                PSETS{PSET_read_counter}.N2_B = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PBEAM* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBEAM* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение MID
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        fprintf (1, '\nНеправильная запись с полем MID в карточке PBEAM* с номером %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                        ErrCode = -1;
                        return;
                    end
                    PSETS{PSET_read_counter}.MID = tmp_number;
                end
                
                % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                % Установка информационных параметров
                Card_name = 'PBEAM*';
                Item_ID = PSETS{PSET_read_counter}.ID;

                % Установка стартовых параметров
                Previous_index = 40;
                Record_length = 16;
                Next_string_large = 1;
                Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                End_card_flag = 0;
                
                % Чтение A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.A = Read_Result;
                end
                
                % Чтение I1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I1 = Read_Result;
                end
                
                % Чтение I2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I2 = Read_Result;
                end
                
                % Чтение I12

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.I12 = Read_Result;
                end
                
                % Чтение J

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.J = Read_Result;
                end
                
                % Чтение NSM

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSM = Read_Result;
                end
                
                % Проверка следующего значения: C1 или SO (вместо C1 сразу может быть строка SO)
                
                [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string);
                
                if ((isempty(Read_Result)) || ((~isempty(Read_Result)) && strcmp(Result_type, 'REAL')))
                    
                    % Чтение C1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C1 = Read_Result;
                    end

                    % Чтение C2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.C2 = Read_Result;
                    end

                    % Чтение D1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D1 = Read_Result;
                    end

                    % Чтение D2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.D2 = Read_Result;
                    end

                    % Чтение E1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E1 = Read_Result;
                    end

                    % Чтение E2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.E2 = Read_Result;
                    end

                    % Чтение F1

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F1 = Read_Result;
                    end

                    % Чтение F2

                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                    if (ErrCode < 0)
                        return;
                    end

                    if (~isempty(Read_Result))
                        PSETS{PSET_read_counter}.F2 = Read_Result;
                    end
                    
                end
                
                % Проверка следующего значения на присутствие SO
                
                [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string);
                
                if ((~isempty(Read_Result)) && strcmp(Result_type, 'CHAR'))
                    
                    PSETS{PSET_read_counter}.Intermediate_states_data = cell(N_pbeam_int_states_preallocated,1);
                                        
                    while(1)
                        
                        PSETS{PSET_read_counter}.N_intermediate_states = PSETS{PSET_read_counter}.N_intermediate_states + 1;
                        
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.A = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I12 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.J = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E2 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F1 = [];
                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F2 = [];
                        
                        % Чтение SO
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_C(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем SO в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем SO в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = Read_Result;
                        
                        % Чтение X_XB
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем X/XB в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode == -3)
                            fprintf (1, '\nНеправильная запись с полем X/XB в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем X/XB в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = Read_Result;
                        
                        % Чтение A

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.A = Read_Result;
                        end

                        % Чтение I1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I1 = Read_Result;
                        end

                        % Чтение I2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I2 = Read_Result;
                        end

                        % Чтение I12

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.I12 = Read_Result;
                        end

                        % Чтение J

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.J = Read_Result;
                        end

                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = Read_Result;
                        end
                        
                        % Чтение второй строки, только если SO=YES
                        
                        if (strcmpi(PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO, 'YES'))
                            
                            % Чтение C1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C1 = Read_Result;
                            end

                            % Чтение C2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.C2 = Read_Result;
                            end

                            % Чтение D1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D1 = Read_Result;
                            end

                            % Чтение D2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.D2 = Read_Result;
                            end

                            % Чтение E1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E1 = Read_Result;
                            end

                            % Чтение E2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.E2 = Read_Result;
                            end

                            % Чтение F1

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F1 = Read_Result;
                            end

                            % Чтение F2

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.F2 = Read_Result;
                            end
                            
                        end
                        
                        % Если конец карточки, то выходим из цикла
                        
                        if (End_card_flag == 1)
                            break;
                        end
                        
                        % Если следующее поле не CHAR, то выходим из цикла
                        
                        [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string);

                        if ((isempty(Read_Result)) || ((~isempty(Read_Result)) && strcmp(Result_type, 'REAL')))
                            break;
                        end

                    end
                    
                end
                
                % Чтение K1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.K1 = Read_Result;
                end
                
                % Чтение K2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.K2 = Read_Result;
                end
                
                % Чтение S1

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.S1 = Read_Result;
                end
                
                % Чтение S2

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.S2 = Read_Result;
                end

                % Чтение NSI_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSI_A = Read_Result;
                end
                
                % Чтение NSI_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.NSI_B = Read_Result;
                end
                
                % Чтение CW_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.CW_A = Read_Result;
                end
                
                % Чтение CW_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.CW_B = Read_Result;
                end
                
                % Чтение M1_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M1_A = Read_Result;
                end
                
                % Чтение M2_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M2_A = Read_Result;
                end
                
                % Чтение M1_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M1_B = Read_Result;
                end
                
                % Чтение M2_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.M2_B = Read_Result;
                end
                
                % Чтение N1_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N1_A = Read_Result;
                end
                
                % Чтение N2_A

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N2_A = Read_Result;
                end
                
                % Чтение N1_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N1_B = Read_Result;
                end
                
                % Чтение N2_B

                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                if (ErrCode < 0)
                    return;
                end

                if (~isempty(Read_Result))
                    PSETS{PSET_read_counter}.N2_B = Read_Result;
                end
                
                % финализация массива ячеек Intermediate_states_data
                if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                    PSETS{PSET_read_counter}.Intermediate_states_data = PSETS{PSET_read_counter}.Intermediate_states_data(1:PSETS{PSET_read_counter}.N_intermediate_states);
                end
                
                % Сортировка массива ячеек Intermediate_states_data по возрастанию параметра X_XB
                if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                    tmp_array = zeros(PSETS{PSET_read_counter}.N_intermediate_states,2);
                    for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                        tmp_array(k,1) = PSETS{PSET_read_counter}.Intermediate_states_data{k}.X_XB;
                        tmp_array(k,2) = k;
                    end
                    tmp_array = sortrows(tmp_array, 1);
                    tmp_cell_array = cell(PSETS{PSET_read_counter}.N_intermediate_states,1);
                    for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                        tmp_cell_array(k) = PSETS{PSET_read_counter}.Intermediate_states_data(tmp_array(k,2));
                    end
                    PSETS{PSET_read_counter}.Intermediate_states_data = tmp_cell_array;
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PBEAML (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAML'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке PBEAML [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBEAML';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.GROUP = [];
                        PSETS{PSET_read_counter}.TYPE = [];
                        PSETS{PSET_read_counter}.DIM = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.N_intermediate_states = 0;
                        PSETS{PSET_read_counter}.Intermediate_states_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBEAML : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBEAML %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 24)
                            End_index = length(string);
                        else
                            End_index = 24;
                        end
                        tmp_number = str2double(string(17:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBEAML %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'PBEAML';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение GROUP

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.GROUP = Read_Result;
                        end
                        
                        % Чтение TYPE
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_C(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.TYPE = Read_Result;
                        
                        % Выделение памяти
                        
                        switch upper(PSETS{PSET_read_counter}.TYPE)
                            
                            case 'ROD'
                                N_dim = 1;
                            case 'TUBE'
                                N_dim = 2;
                            case 'TUBE2'
                                N_dim = 2;
                            case 'L'
                                N_dim = 4;
                            case 'I'
                                N_dim = 6;
                            case 'CHAN'
                                N_dim = 4;
                            case 'T'
                                N_dim = 4;
                            case 'BOX'
                                N_dim = 4;
                            case 'BAR'
                                N_dim = 2;
                            case 'CROSS'
                                N_dim = 4;
                            case 'H'
                                N_dim = 4;
                            case 'T1'
                                N_dim = 4;
                            case 'I1'
                                N_dim = 4;
                            case 'CHAN1'
                                N_dim = 4;
                            case 'Z'
                                N_dim = 4;
                            case 'CHAN2'
                                N_dim = 4;
                            case 'T2'
                                N_dim = 4;
                            case 'BOX1'
                                N_dim = 6;
                            case 'HEXA'
                                N_dim = 3;
                            case 'HAT'
                                N_dim = 4;
                            case 'HAT1'
                                N_dim = 5;
                            case 'DBOX'
                                N_dim = 10;
                            otherwise
                                fprintf (1, '\nНеизвестныя запись с полем TYPE в карточке %s с номером %i: [%s] !\n', Card_name, Item_ID, PSETS{PSET_read_counter}.TYPE);
                                ErrCode = -1;
                                return;
                            
                        end
                        
                        PSETS{PSET_read_counter}.DIM = zeros(N_dim,1);
                        
                        % Перевод на следующую строку
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (End_card_flag == 1)
                            break;
                        end
                        
                        % Чтение DIM
                        
                        for k=1:N_dim
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.DIM(k) = Read_Result;
                            
                        end
                        
                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.NSM = Read_Result;
                        end
                        
                        % Чтение промежуточных состояний

                        PSETS{PSET_read_counter}.Intermediate_states_data = cell(N_pbeaml_int_states_preallocated,1);

                        while(1)
                            
                            Field_read_flag = 0;

                            PSETS{PSET_read_counter}.N_intermediate_states = PSETS{PSET_read_counter}.N_intermediate_states + 1;

                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = [];
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = [];
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.DIM = -ones(N_dim,1);
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = [];
                            
                            % Чтение SO

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = Read_Result;
                            end
                            
                            % Чтение X_XB

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = Read_Result;
                            end

                            % Чтение DIM

                            for k=1:N_dim

                                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                                if (ErrCode < 0)
                                    return;
                                end

                                if (~isempty(Read_Result))
                                    Field_read_flag = 1;
                                    PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.DIM(k) = Read_Result;
                                end

                            end

                            % Чтение NSM

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = Read_Result;
                            end
                            
                            % Если в действительности не считано ни одного поля, то выходим из цикла
                            
                            if (Field_read_flag == 0)
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states} = [];
                                PSETS{PSET_read_counter}.N_intermediate_states = PSETS{PSET_read_counter}.N_intermediate_states - 1;
                                break;
                            end

                            % Если конец карточки, то выходим из цикла

                            if (End_card_flag == 1)
                                break;
                            end

                        end
                        
                        % Если не было считано ни одного промежуточного состояния
                        if (PSETS{PSET_read_counter}.N_intermediate_states == 0)
                            PSETS{PSET_read_counter}.Intermediate_states_data = [];
                        end
                        
                        % финализация массива ячеек Intermediate_states_data
                        if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                            PSETS{PSET_read_counter}.Intermediate_states_data = PSETS{PSET_read_counter}.Intermediate_states_data(1:PSETS{PSET_read_counter}.N_intermediate_states);
                        end

                        % Сортировка массива ячеек Intermediate_states_data по возрастанию параметра X_XB
                        if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                            tmp_array = zeros(PSETS{PSET_read_counter}.N_intermediate_states,2);
                            for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                                if (isempty(PSETS{PSET_read_counter}.Intermediate_states_data{k}.X_XB))
                                    tmp_array(k,1) = 1;
                                else
                                    tmp_array(k,1) = PSETS{PSET_read_counter}.Intermediate_states_data{k}.X_XB;
                                end
                                tmp_array(k,2) = k;
                            end
                            tmp_array = sortrows(tmp_array, 1);
                            tmp_cell_array = cell(PSETS{PSET_read_counter}.N_intermediate_states,1);
                            for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                                tmp_cell_array(k) = PSETS{PSET_read_counter}.Intermediate_states_data(tmp_array(k,2));
                            end
                            PSETS{PSET_read_counter}.Intermediate_states_data = tmp_cell_array;
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;
                        
                    case '*' % LARGE FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBEAML';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.GROUP = [];
                        PSETS{PSET_read_counter}.TYPE = [];
                        PSETS{PSET_read_counter}.DIM = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.N_intermediate_states = 0;
                        PSETS{PSET_read_counter}.Intermediate_states_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBEAML* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBEAML* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 40)
                            End_index = length(string);
                        else
                            End_index = 40;
                        end
                        tmp_number = str2double(string(25:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBEAML* %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'PBEAML*';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение GROUP

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.GROUP = Read_Result;
                        end
                        
                        % Чтение TYPE
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_C(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode == -2)
                            fprintf (1, '\nПустая запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            return;
                        end

                        if (ErrCode < 0)
                            return;
                        end

                        if (isempty(Read_Result))
                            fprintf (1, '\nОтсутствует запись с полем TYPE в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        PSETS{PSET_read_counter}.TYPE = Read_Result;
                        
                        % Выделение памяти
                        
                        switch upper(PSETS{PSET_read_counter}.TYPE)
                            
                            case 'ROD'
                                N_dim = 1;
                            case 'TUBE'
                                N_dim = 2;
                            case 'TUBE2'
                                N_dim = 2;
                            case 'L'
                                N_dim = 4;
                            case 'I'
                                N_dim = 6;
                            case 'CHAN'
                                N_dim = 4;
                            case 'T'
                                N_dim = 4;
                            case 'BOX'
                                N_dim = 4;
                            case 'BAR'
                                N_dim = 2;
                            case 'CROSS'
                                N_dim = 4;
                            case 'H'
                                N_dim = 4;
                            case 'T1'
                                N_dim = 4;
                            case 'I1'
                                N_dim = 4;
                            case 'CHAN1'
                                N_dim = 4;
                            case 'Z'
                                N_dim = 4;
                            case 'CHAN2'
                                N_dim = 4;
                            case 'T2'
                                N_dim = 4;
                            case 'BOX1'
                                N_dim = 6;
                            case 'HEXA'
                                N_dim = 3;
                            case 'HAT'
                                N_dim = 4;
                            case 'HAT1'
                                N_dim = 5;
                            case 'DBOX'
                                N_dim = 10;
                            otherwise
                                fprintf (1, '\nНеизвестныя запись с полем TYPE в карточке %s с номером %i: [%s] !\n', Card_name, Item_ID, PSETS{PSET_read_counter}.TYPE);
                                ErrCode = -1;
                                return;
                            
                        end
                        
                        PSETS{PSET_read_counter}.DIM = zeros(N_dim,1);
                        
                        % Перевод на следующую строку
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (End_card_flag == 1)
                            break;
                        end
                        
                        % Чтение DIM
                        
                        for k=1:N_dim
                            
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с полем DIM%i в карточке %s с номером %i !\n', k, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.DIM(k) = Read_Result;
                            
                        end
                        
                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.NSM = Read_Result;
                        end
                        
                        % Чтение промежуточных состояний

                        PSETS{PSET_read_counter}.Intermediate_states_data = cell(N_pbeaml_int_states_preallocated,1);

                        while(1)
                            
                            Field_read_flag = 0;

                            PSETS{PSET_read_counter}.N_intermediate_states = PSETS{PSET_read_counter}.N_intermediate_states + 1;

                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = [];
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = [];
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.DIM = -ones(N_dim,1);
                            PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = [];
                            
                            % Чтение SO

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.SO = Read_Result;
                            end
                            
                            % Чтение X_XB

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.X_XB = Read_Result;
                            end

                            % Чтение DIM

                            for k=1:N_dim

                                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                                if (ErrCode < 0)
                                    return;
                                end

                                if (~isempty(Read_Result))
                                    Field_read_flag = 1;
                                    PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.DIM(k) = Read_Result;
                                end

                            end

                            % Чтение NSM

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states}.NSM = Read_Result;
                            end
                            
                            % Если в действительности не считано ни одного поля, то выходим из цикла
                            
                            if (Field_read_flag == 0)
                                PSETS{PSET_read_counter}.Intermediate_states_data{PSETS{PSET_read_counter}.N_intermediate_states} = [];
                                PSETS{PSET_read_counter}.N_intermediate_states = PSETS{PSET_read_counter}.N_intermediate_states - 1;
                                break;
                            end

                            % Если конец карточки, то выходим из цикла

                            if (End_card_flag == 1)
                                break;
                            end

                        end
                        
                        % Если не было считано ни одного промежуточного состояния
                        if (PSETS{PSET_read_counter}.N_intermediate_states == 0)
                            PSETS{PSET_read_counter}.Intermediate_states_data = [];
                        end
                        
                        % финализация массива ячеек Intermediate_states_data
                        if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                            PSETS{PSET_read_counter}.Intermediate_states_data = PSETS{PSET_read_counter}.Intermediate_states_data(1:PSETS{PSET_read_counter}.N_intermediate_states);
                        end

                        % Сортировка массива ячеек Intermediate_states_data по возрастанию параметра X_XB
                        if (PSETS{PSET_read_counter}.N_intermediate_states > 0)
                            tmp_array = zeros(PSETS{PSET_read_counter}.N_intermediate_states,2);
                            for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                                if (isempty(PSETS{PSET_read_counter}.Intermediate_states_data{k}.X_XB))
                                    tmp_array(k,1) = 1;
                                else
                                    tmp_array(k,1) = PSETS{PSET_read_counter}.Intermediate_states_data{k}.X_XB;
                                end
                                tmp_array(k,2) = k;
                            end
                            tmp_array = sortrows(tmp_array, 1);
                            tmp_cell_array = cell(PSETS{PSET_read_counter}.N_intermediate_states,1);
                            for k=1:PSETS{PSET_read_counter}.N_intermediate_states
                                tmp_cell_array(k) = PSETS{PSET_read_counter}.Intermediate_states_data(tmp_array(k,2));
                            end
                            PSETS{PSET_read_counter}.Intermediate_states_data = tmp_cell_array;
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBEAML,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [PBEAML%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение PCOMP
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'COMP ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PCOMP';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.Patran_laminate_name = [];
                PSETS{PSET_read_counter}.Z0 = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.SB = [];
                PSETS{PSET_read_counter}.FT = [];
                PSETS{PSET_read_counter}.TREF = [];
                PSETS{PSET_read_counter}.GE = [];
                PSETS{PSET_read_counter}.LAM = [];
                PSETS{PSET_read_counter}.N_plies = 0;
                PSETS{PSET_read_counter}.Laminate = zeros(N_plies_preallocated, 4);
                
                % Чтение ID
                if (length(string) < 16)
                    End_index = length(string);
                else
                    End_index = 16;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PCOMP : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PCOMP %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name и Patran_laminate_name (Patran 2008)
                if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                    if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                        if ((length(Previous_strings{3} ) >= 69) && strcmp(Previous_strings{3}(1:69), '$ Composite Property Record created from P3/PATRAN composite material'))
                            if ((length(Previous_strings{2} ) >= 11) && strcmp(Previous_strings{2}(1:10), '$ record :'))  % здесь нет ошибки с 10 и 11
                                PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(11:length(Previous_strings{2})));
                                if ((length(Previous_strings{4} ) >= 47) && strcmp(Previous_strings{4}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{4}(47:length(Previous_strings{4})));
                                else
                                    if ((length(Previous_strings{4} ) >= 3) && strcmp(Previous_strings{4}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                        if ((length(Previous_strings{5} ) >= 47) && strcmp(Previous_strings{5}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{5}(47:length(Previous_strings{5}))) strtrim(Previous_strings{4}(3:length(Previous_strings{4})))];
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
                
                % Чтение Patran_name и Patran_laminate_name (Patran 2011)
                if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                    if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                        if ((length(Previous_strings{2} ) >= 59) && strcmp(Previous_strings{2}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                            PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(59:length(Previous_strings{2})));
                            Index_shift = 0;
                        else
                            if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                if ((length(Previous_strings{3} ) >= 59) && strcmp(Previous_strings{3}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                                    PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(59:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                    Index_shift = 1;
                                end
                            end
                        end
                        if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                            else
                                if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                    if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                    end
                                end
                            end
                        end
                    end
                end
                
                % Чтение Patran_name и Patran_laminate_name (Patran 2012, 2014, 2016, 2017)
                if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                    if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                        if ((length(Previous_strings{2} ) >= 41) && strcmp(Previous_strings{2}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                            PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(41:length(Previous_strings{2})));
                            Index_shift = 0;
                        else
                            if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                if ((length(Previous_strings{3} ) >= 41) && strcmp(Previous_strings{3}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                                    PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(41:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                    Index_shift = 1;
                                end
                            end
                        end
                        if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                            else
                                if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                    if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                    end
                                end
                            end
                        end
                    end
                end
                
                % Чтение Z0
                if (length(Trim_CR_LF(string)) > 16)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    tmp_number = str2double(string(17:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(17:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.Z0 = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.Z0 = tmp_number;
                    end
                end
                
                % Чтение NSM
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 32)
                        End_index = length(string);
                    else
                        End_index = 32;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.NSM = tmp_number;
                    end
                end
                
                % Чтение SB
                if (length(Trim_CR_LF(string)) > 32)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(33:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(33:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.SB = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.SB = tmp_number;
                    end
                end
                
                % Чтение FT
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 48)
                        End_index = length(string);
                    else
                        End_index = 48;
                    end
                    if (~isempty(strtrim(string(41:End_index))))
                        PSETS{PSET_read_counter}.FT = strtrim(string(41:End_index));
                    end
                end
                
                % Чтение TREF
                if (length(Trim_CR_LF(string)) > 48)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(49:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(49:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.TREF = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.TREF = tmp_number;
                    end
                end
                
                % Чтение GE
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 64)
                        End_index = length(string);
                    else
                        End_index = 64;
                    end
                    tmp_number = str2double(string(57:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.GE = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.GE = tmp_number;
                    end
                end
                
                % Чтение LAM
                if (length(Trim_CR_LF(string)) > 64)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    if (~isempty(strtrim(string(65:End_index))))
                        PSETS{PSET_read_counter}.LAM = strtrim(string(65:End_index));
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    fprintf (1, '\nНеожиданный конец файла во время чтения карточки PCOMP с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Чтение следующей строки
                N_prev_str = size(Previous_strings,1);
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);

                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PCOMP %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end 

                % Проверка первого символа
                if (~((string(1) == '*') || (string(1) == ' ')))
                    fprintf (1, '\nВторая строка карточки PCOMP с номером %i не начинается с символа * или с пробела !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Строка * без полей
                if ((string(1) == '*') && (length(strtrim(string)) == 1))
                    fprintf (1, '\nПустая вторая строка карточки PCOMP с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Строка только из белых символов
                if (isempty(strtrim(string)))
                    fprintf (1, '\nПустая вторая строка карточки PCOMP с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Проверка длины строки
                if (length(string) <= 2)
                    fprintf (1, '\nСтрока из двух или менее символов в карточке PCOMP с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Проверка длины первого поля
                if (length(Trim_CR_LF(string)) < 8)
                    fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке PCOMP с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Установка информационных параметров
                Card_name = 'PCOMP';
                Item_ID = PSETS{PSET_read_counter}.ID;
                
                % Установка стартовых параметров
                switch string(1)

                    case ' '
                        Previous_index = 8;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;

                    case '*'
                        Previous_index = 8;
                        Record_length = 16;
                        Next_string_large = 1; % Так как это всегда первая (открывающая) строка
                        Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;

                end
                
                % Флаг первого слоя
                First_ply_flag = 1;
                
                % Чтение слоев
                while (1)
                    
                    PSETS{PSET_read_counter}.N_plies = PSETS{PSET_read_counter}.N_plies + 1;
                    
                    if ((First_ply_flag == 1) && (PSETS{PSET_read_counter}.N_plies > 1))
                        First_ply_flag = 0;
                    end
                    
                    % Чтение MIDi
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (isempty(Read_Result))
                        if (First_ply_flag == 1)
                            fprintf (1, '\nПустая запись с номером первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        else
                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,1) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,1);
                        end
                    else
                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,1) = Read_Result;
                    end
                    
                    % Чтение Ti
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (isempty(Read_Result))
                        if (First_ply_flag == 1)
                            fprintf (1, '\nПустая запись с толщиной первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        else
                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,2);
                        end
                    else
                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = Read_Result;
                    end                    
                    
                    % Чтение THETAi
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode == -2)
                        fprintf (1, '\nПустая запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        return;
                    end

                    if (ErrCode == -3)
                        fprintf (1, '\nНеправильная запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                        return;
                    end

                    if (ErrCode < 0)
                        return;
                    end

                    if (isempty(Read_Result))
                        fprintf (1, '\nОтсутствует запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                    
                    PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,3) = Read_Result;
                    
                    % Чтение SOUTi
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (~isempty(Read_Result))
                        
                        switch upper(Read_Result)
                            
                            case 'YES'
                                
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,4) = 1;
                                
                            case 'NO'
                                
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,4) = 0;
                                
                            otherwise
                                
                                fprintf (1, '\nНеизвестная запись с параметром SOUT в карточке %s с номером %i [%s]!\n', Card_name, Item_ID, Read_Result);
                                ErrCode = -1;
                                return;
                            
                        end
                        
                    end
                    
                    if (End_card_flag == 1)
                        break;
                    end
                    
                    % Перевод на следующую строку, если чтение перенеслось на строку * без полей
                    if ((Record_read_counter == 0) && (string(1) == '*') && (length(strtrim(string)) == 1))

                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (End_card_flag == 1)
                            break;
                        end

                    end
                    
                    % Перевод на следующую строку, если используется формат карточки с одним слоем в строке (только для short field format)
                    if ((Record_read_counter == 4) && (length(Trim_CR_LF(string)) <= 5*Record_length))
                        
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (End_card_flag == 1)
                            break;
                        end
                        
                    end
                    
                end
                
                % Проверка на число слоев ламината
                if (PSETS{PSET_read_counter}.N_plies == 0)
                    fprintf (1, '\nНулевое число слоев ламината в карточке %s с номером %i !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                end

                % Финализация массива слоев
                PSETS{PSET_read_counter}.Laminate = PSETS{PSET_read_counter}.Laminate(1:PSETS{PSET_read_counter}.N_plies,:);
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'COMP*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PCOMP';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.Patran_laminate_name = [];
                PSETS{PSET_read_counter}.Z0 = [];
                PSETS{PSET_read_counter}.NSM = [];
                PSETS{PSET_read_counter}.SB = [];
                PSETS{PSET_read_counter}.FT = [];
                PSETS{PSET_read_counter}.TREF = [];
                PSETS{PSET_read_counter}.GE = [];
                PSETS{PSET_read_counter}.LAM = [];
                PSETS{PSET_read_counter}.N_plies = 0;
                PSETS{PSET_read_counter}.Laminate = zeros(N_plies_preallocated, 4);
                
                % Чтение ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(9:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PCOMP* : [%s] !\n', strtrim(string(9:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PCOMP* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name и Patran_laminate_name (Patran 2008)
                if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                    if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                        if ((length(Previous_strings{3} ) >= 69) && strcmp(Previous_strings{3}(1:69), '$ Composite Property Record created from P3/PATRAN composite material'))
                            if ((length(Previous_strings{2} ) >= 11) && strcmp(Previous_strings{2}(1:10), '$ record :'))  % здесь нет ошибки с 10 и 11
                                PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(11:length(Previous_strings{2})));
                                if ((length(Previous_strings{4} ) >= 47) && strcmp(Previous_strings{4}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{4}(47:length(Previous_strings{4})));
                                else
                                    if ((length(Previous_strings{4} ) >= 3) && strcmp(Previous_strings{4}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                        if ((length(Previous_strings{5} ) >= 47) && strcmp(Previous_strings{5}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{5}(47:length(Previous_strings{5}))) strtrim(Previous_strings{4}(3:length(Previous_strings{4})))];
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
                
                % Чтение Patran_name и Patran_laminate_name (Patran 2011)
                if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                    if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                        if ((length(Previous_strings{2} ) >= 59) && strcmp(Previous_strings{2}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                            PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(59:length(Previous_strings{2})));
                            Index_shift = 0;
                        else
                            if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                if ((length(Previous_strings{3} ) >= 59) && strcmp(Previous_strings{3}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                                    PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(59:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                    Index_shift = 1;
                                end
                            end
                        end
                        if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                            else
                                if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                    if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                    end
                                end
                            end
                        end
                    end
                end
                
                % Чтение Patran_name и Patran_laminate_name (Patran 2012, 2014, 2016, 2017)
                if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                    if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                        if ((length(Previous_strings{2} ) >= 41) && strcmp(Previous_strings{2}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                            PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(41:length(Previous_strings{2})));
                            Index_shift = 0;
                        else
                            if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                if ((length(Previous_strings{3} ) >= 41) && strcmp(Previous_strings{3}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                                    PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(41:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                    Index_shift = 1;
                                end
                            end
                        end
                        if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                            else
                                if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                    if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                    end
                                end
                            end
                        end
                    end
                end
                
                % Чтение Z0
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.Z0 = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.Z0 = tmp_number;
                    end
                end
                
                % Чтение NSM
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.NSM = tmp_number;
                    end
                end
                
                % Чтение SB
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    tmp_number = str2double(string(57:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.SB = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.SB = tmp_number;
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    fprintf (1, '\nНеожиданный конец файла во время чтения карточки PCOMP* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение следующей строки
                N_prev_str = size(Previous_strings,1);
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);

                % Проверка строки
                if (~(string(1) == '*'))
                    fprintf (1, '\nВторая строка в карточке PCOMP* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                    ErrCode = -1;
                    return;
                end

                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PCOMP* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end                
                
                % Чтение FT
                if (length(Trim_CR_LF(string)) > 8)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    if (~isempty(strtrim(string(9:End_index))))
                        PSETS{PSET_read_counter}.FT = strtrim(string(9:End_index));
                    end
                end
                
                % Чтение TREF
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    tmp_number = str2double(string(25:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.TREF = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.TREF = tmp_number;
                    end
                end
                
                % Чтение GE
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    tmp_number = str2double(string(41:End_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                        if (size(tmp_number_2,1) == 2)
                            PSETS{PSET_read_counter}.GE = tmp_number_2(1)*10^tmp_number_2(2);
                        end
                    else
                        PSETS{PSET_read_counter}.GE = tmp_number;
                    end
                end
                
                % Чтение LAM
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    if (~isempty(strtrim(string(57:End_index))))
                        PSETS{PSET_read_counter}.LAM = strtrim(string(57:End_index));
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    fprintf (1, '\nНеожиданный конец файла во время чтения карточки PCOMP* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Чтение следующей строки
                N_prev_str = size(Previous_strings,1);
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);

                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 третьей строки карточки PCOMP* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end 

                % Проверка первого символа
                if (~((string(1) == '*') || (string(1) == ' ')))
                    fprintf (1, '\nТретья строка карточки PCOMP* с номером %i не начинается с символа * или с пробела !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Строка * без полей
                if ((string(1) == '*') && (length(strtrim(string)) == 1))
                    fprintf (1, '\nПустая третья строка карточки PCOMP* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Строка только из белых символов
                if (isempty(strtrim(string)))
                    fprintf (1, '\nПустая третья строка карточки PCOMP* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Проверка длины строки
                if (length(string) <= 2)
                    fprintf (1, '\nСтрока из двух или менее символов в карточке PCOMP* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end

                % Проверка длины первого поля
                if (length(Trim_CR_LF(string)) < 8)
                    fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке PCOMP* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Не считано ни одного слоя ламината.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Установка информационных параметров
                Card_name = 'PCOMP*';
                Item_ID = PSETS{PSET_read_counter}.ID;
                
                % Установка стартовых параметров
                switch string(1)

                    case ' '
                        Previous_index = 8;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;

                    case '*'
                        Previous_index = 8;
                        Record_length = 16;
                        Next_string_large = 1; % Так как это всегда первая (открывающая) строка
                        Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;

                end
                
                % Флаг первого слоя
                First_ply_flag = 1;
                
                % Чтение слоев
                while (1)
                    
                    PSETS{PSET_read_counter}.N_plies = PSETS{PSET_read_counter}.N_plies + 1;
                    
                    if ((First_ply_flag == 1) && (PSETS{PSET_read_counter}.N_plies > 1))
                        First_ply_flag = 0;
                    end
                    
                    % Чтение MIDi
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (isempty(Read_Result))
                        if (First_ply_flag == 1)
                            fprintf (1, '\nПустая запись с номером первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        else
                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,1) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,1);
                        end
                    else
                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,1) = Read_Result;
                    end
                    
                    % Чтение Ti
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (isempty(Read_Result))
                        if (First_ply_flag == 1)
                            fprintf (1, '\nПустая запись с толщиной первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        else
                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,2);
                        end
                    else
                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = Read_Result;
                    end                    
                    
                    % Чтение THETAi
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode == -2)
                        fprintf (1, '\nПустая запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        return;
                    end

                    if (ErrCode == -3)
                        fprintf (1, '\nНеправильная запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                        return;
                    end

                    if (ErrCode < 0)
                        return;
                    end

                    if (isempty(Read_Result))
                        fprintf (1, '\nОтсутствует запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                        fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                    
                    PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,3) = Read_Result;
                    
                    % Чтение SOUTi
                    [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                    
                    if (ErrCode < 0)
                        return;
                    end
                    
                    if (~isempty(Read_Result))
                        
                        switch upper(Read_Result)
                            
                            case 'YES'
                                
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,4) = 1;
                                
                            case 'NO'
                                
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,4) = 0;
                                
                            otherwise
                                
                                fprintf (1, '\nНеизвестная запись с параметром SOUT в карточке %s с номером %i [%s]!\n', Card_name, Item_ID, Read_Result);
                                ErrCode = -1;
                                return;
                            
                        end
                        
                    end
                    
                    if (End_card_flag == 1)
                        break;
                    end
                    
                    % Перевод на следующую строку, если чтение перенеслось на строку * без полей
                    if ((Record_read_counter == 0) && (string(1) == '*') && (length(strtrim(string)) == 1))

                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (End_card_flag == 1)
                            break;
                        end

                    end
                    
                    % Перевод на следующую строку, если используется формат карточки с одним слоем в строке (только для short field format)
                    if ((Record_read_counter == 4) && (length(Trim_CR_LF(string)) <= 5*Record_length))
                        
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (End_card_flag == 1)
                            break;
                        end
                        
                    end
                    
                end
                
                % Проверка на число слоев ламината
                if (PSETS{PSET_read_counter}.N_plies == 0)
                    fprintf (1, '\nНулевое число слоев ламината в карточке %s с номером %i !\n', Card_name, Item_ID);
                    ErrCode = -1;
                    return;
                end

                % Финализация массива слоев
                PSETS{PSET_read_counter}.Laminate = PSETS{PSET_read_counter}.Laminate(1:PSETS{PSET_read_counter}.N_plies,:);
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PCOMPG (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'COMPG'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке PCOMPG [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PCOMPG';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.Patran_laminate_name = [];
                        PSETS{PSET_read_counter}.Z0 = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.SB = [];
                        PSETS{PSET_read_counter}.FT = [];
                        PSETS{PSET_read_counter}.TREF = [];
                        PSETS{PSET_read_counter}.GE = [];
                        PSETS{PSET_read_counter}.LAM = [];
                        PSETS{PSET_read_counter}.N_plies = 0;
                        PSETS{PSET_read_counter}.Laminate = zeros(N_plies_preallocated, 5);
                        PSETS{PSET_read_counter}.GEFLG = [];

                        % Чтение ID
                        if (length(string) < 16)
                            End_index = length(string);
                        else
                            End_index = 16;
                        end
                        tmp_number = str2double(string(9:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PCOMPG : [%s] !\n', strtrim(string(9:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PCOMPG %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name и Patran_laminate_name (Patran 2008)
                        if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                                if ((length(Previous_strings{3} ) >= 69) && strcmp(Previous_strings{3}(1:69), '$ Composite Property Record created from P3/PATRAN composite material'))
                                    if ((length(Previous_strings{2} ) >= 11) && strcmp(Previous_strings{2}(1:10), '$ record :'))  % здесь нет ошибки с 10 и 11
                                        PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(11:length(Previous_strings{2})));
                                        if ((length(Previous_strings{4} ) >= 47) && strcmp(Previous_strings{4}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{4}(47:length(Previous_strings{4})));
                                        else
                                            if ((length(Previous_strings{4} ) >= 3) && strcmp(Previous_strings{4}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                                if ((length(Previous_strings{5} ) >= 47) && strcmp(Previous_strings{5}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{5}(47:length(Previous_strings{5}))) strtrim(Previous_strings{4}(3:length(Previous_strings{4})))];
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end

                        % Чтение Patran_name и Patran_laminate_name (Patran 2011)
                        if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                                if ((length(Previous_strings{2} ) >= 59) && strcmp(Previous_strings{2}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                                    PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(59:length(Previous_strings{2})));
                                    Index_shift = 0;
                                else
                                    if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                        if ((length(Previous_strings{3} ) >= 59) && strcmp(Previous_strings{3}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                                            PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(59:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                            Index_shift = 1;
                                        end
                                    end
                                end
                                if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                                    if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                                    else
                                        if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                            if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                                PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                            end
                                        end
                                    end
                                end
                            end
                        end

                        % Чтение Patran_name и Patran_laminate_name (Patran 2012, 2014, 2016, 2017)
                        if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                                if ((length(Previous_strings{2} ) >= 41) && strcmp(Previous_strings{2}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                                    PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(41:length(Previous_strings{2})));
                                    Index_shift = 0;
                                else
                                    if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                        if ((length(Previous_strings{3} ) >= 41) && strcmp(Previous_strings{3}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                                            PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(41:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                            Index_shift = 1;
                                        end
                                    end
                                end
                                if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                                    if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                                    else
                                        if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                            if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                                PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                            end
                                        end
                                    end
                                end
                            end
                        end
                        
                        % Чтение Z0
                        if (length(Trim_CR_LF(string)) > 16)
                            if (length(string) < 24)
                                End_index = length(string);
                            else
                                End_index = 24;
                            end
                            tmp_number = str2double(string(17:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(17:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z0 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z0 = tmp_number;
                            end
                        end

                        % Чтение NSM
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 32)
                                End_index = length(string);
                            else
                                End_index = 32;
                            end
                            tmp_number = str2double(string(25:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.NSM = tmp_number;
                            end
                        end

                        % Чтение SB
                        if (length(Trim_CR_LF(string)) > 32)
                            if (length(string) < 40)
                                End_index = length(string);
                            else
                                End_index = 40;
                            end
                            tmp_number = str2double(string(33:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(33:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.SB = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.SB = tmp_number;
                            end
                        end

                        % Чтение FT
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 48)
                                End_index = length(string);
                            else
                                End_index = 48;
                            end
                            if (~isempty(strtrim(string(41:End_index))))
                                PSETS{PSET_read_counter}.FT = strtrim(string(41:End_index));
                            end
                        end

                        % Чтение TREF
                        if (length(Trim_CR_LF(string)) > 48)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            tmp_number = str2double(string(49:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(49:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.TREF = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.TREF = tmp_number;
                            end
                        end

                        % Чтение GE
                        if (length(Trim_CR_LF(string)) > 56)
                            if (length(string) < 64)
                                End_index = length(string);
                            else
                                End_index = 64;
                            end
                            tmp_number = str2double(string(57:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.GE = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.GE = tmp_number;
                            end
                        end

                        % Чтение LAM
                        if (length(Trim_CR_LF(string)) > 64)
                            if (length(string) < 72)
                                End_index = length(string);
                            else
                                End_index = 72;
                            end
                            if (~isempty(strtrim(string(65:End_index))))
                                PSETS{PSET_read_counter}.LAM = strtrim(string(65:End_index));
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PCOMPG с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PCOMPG %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end 
                        
                        % Проверка первого символа
                        if (~((string(1) == '*') || (string(1) == ' ')))
                            fprintf (1, '\nВторая строка карточки PCOMPG с номером %i не начинается с символа * или с пробела !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Строка * без полей
                        if ((string(1) == '*') && (length(strtrim(string)) == 1))
                            fprintf (1, '\nПустая вторая строка карточки PCOMPG с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Строка только из белых символов
                        if (isempty(strtrim(string)))
                            fprintf (1, '\nПустая вторая строка карточки PCOMPG с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Проверка длины строки
                        if (length(string) <= 2)
                            fprintf (1, '\nСтрока из двух или менее символов в карточке PCOMPG с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Проверка длины первого поля
                        if (length(Trim_CR_LF(string)) < 8)
                            fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке PCOMPG с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Установка информационных параметров
                        Card_name = 'PCOMPG';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        switch string(1)

                            case ' '
                                Previous_index = 8;
                                Record_length = 8;
                                Next_string_large = 0;
                                Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                                End_card_flag = 0;

                            case '*'
                                Previous_index = 8;
                                Record_length = 16;
                                Next_string_large = 1; % Так как это всегда первая (открывающая) строка
                                Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                                End_card_flag = 0;

                        end

                        % Флаг первого слоя
                        First_ply_flag = 1;

                        % Чтение слоев
                        while (1)

                            PSETS{PSET_read_counter}.N_plies = PSETS{PSET_read_counter}.N_plies + 1;

                            if ((First_ply_flag == 1) && (PSETS{PSET_read_counter}.N_plies > 1))
                                First_ply_flag = 0;
                            end
                            
                            % Чтение GPLYIDi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с глобальным номером слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с глобальным номером слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с глобальным номером слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,1) = Read_Result;

                            % Чтение MIDi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                if (First_ply_flag == 1)
                                    fprintf (1, '\nПустая запись с номером первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,2);
                                end
                            else
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = Read_Result;
                            end

                            % Чтение Ti
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                if (First_ply_flag == 1)
                                    fprintf (1, '\nПустая запись с толщиной первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,3) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,3);
                                end
                            else
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,3) = Read_Result;
                            end                    

                            % Чтение THETAi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,4) = Read_Result;

                            % Чтение SOUTi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))

                                switch upper(Read_Result)

                                    case 'YES'

                                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,5) = 1;

                                    case 'NO'

                                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,5) = 0;

                                    otherwise

                                        fprintf (1, '\nНеизвестная запись с параметром SOUT в карточке %s с номером %i [%s]!\n', Card_name, Item_ID, Read_Result);
                                        ErrCode = -1;
                                        return;

                                end

                            end
                            
                            % Чтение GEFLG
                            if (First_ply_flag == 1)
                                
                                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                                if (ErrCode < 0)
                                    return;
                                end

                                if (~isempty(Read_Result))
                                    PSETS{PSET_read_counter}.GEFLG = Read_Result;
                                end
                                
                            end

                            % Перевод на следующую строку
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (End_card_flag == 1)
                                break;
                            end

                        end

                        % Проверка на число слоев ламината
                        if (PSETS{PSET_read_counter}.N_plies == 0)
                            fprintf (1, '\nНулевое число слоев ламината в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        % Финализация массива слоев
                        PSETS{PSET_read_counter}.Laminate = PSETS{PSET_read_counter}.Laminate(1:PSETS{PSET_read_counter}.N_plies,:);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PCOMPG';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.Patran_laminate_name = [];
                        PSETS{PSET_read_counter}.Z0 = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.SB = [];
                        PSETS{PSET_read_counter}.FT = [];
                        PSETS{PSET_read_counter}.TREF = [];
                        PSETS{PSET_read_counter}.GE = [];
                        PSETS{PSET_read_counter}.LAM = [];
                        PSETS{PSET_read_counter}.N_plies = 0;
                        PSETS{PSET_read_counter}.Laminate = zeros(N_plies_preallocated, 5);
                        PSETS{PSET_read_counter}.GEFLG = [];

                        % Чтение ID
                        if (length(string) < 24)
                            End_index = length(string);
                        else
                            End_index = 24;
                        end
                        tmp_number = str2double(string(9:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PCOMPG* : [%s] !\n', strtrim(string(9:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PCOMPG* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name и Patran_laminate_name (Patran 2008)
                        if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                                if ((length(Previous_strings{3} ) >= 69) && strcmp(Previous_strings{3}(1:69), '$ Composite Property Record created from P3/PATRAN composite material'))
                                    if ((length(Previous_strings{2} ) >= 11) && strcmp(Previous_strings{2}(1:10), '$ record :'))  % здесь нет ошибки с 10 и 11
                                        PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(11:length(Previous_strings{2})));
                                        if ((length(Previous_strings{4} ) >= 47) && strcmp(Previous_strings{4}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{4}(47:length(Previous_strings{4})));
                                        else
                                            if ((length(Previous_strings{4} ) >= 3) && strcmp(Previous_strings{4}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                                if ((length(Previous_strings{5} ) >= 47) && strcmp(Previous_strings{5}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{5}(47:length(Previous_strings{5}))) strtrim(Previous_strings{4}(3:length(Previous_strings{4})))];
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end

                        % Чтение Patran_name и Patran_laminate_name (Patran 2011)
                        if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                                if ((length(Previous_strings{2} ) >= 59) && strcmp(Previous_strings{2}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                                    PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(59:length(Previous_strings{2})));
                                    Index_shift = 0;
                                else
                                    if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                        if ((length(Previous_strings{3} ) >= 59) && strcmp(Previous_strings{3}(1:58), '$ Composite Property Record created from material record :')) % здесь нет ошибки с 59 и 58
                                            PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(59:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                            Index_shift = 1;
                                        end
                                    end
                                end
                                if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                                    if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                                    else
                                        if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                            if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                                PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                            end
                                        end
                                    end
                                end
                            end
                        end

                        % Чтение Patran_name и Patran_laminate_name (Patran 2012, 2014, 2016, 2017)
                        if (isempty(PSETS{PSET_read_counter}.Patran_name) && isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                            if ((length(Previous_strings{1} ) >= 34) && strcmp(Previous_strings{1}(1:34), '$ Composite Material Description :'))
                                if ((length(Previous_strings{2} ) >= 41) && strcmp(Previous_strings{2}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                                    PSETS{PSET_read_counter}.Patran_laminate_name = strtrim(Previous_strings{2}(41:length(Previous_strings{2})));
                                    Index_shift = 0;
                                else
                                    if ((length(Previous_strings{2} ) >= 3) && strcmp(Previous_strings{2}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                        if ((length(Previous_strings{3} ) >= 41) && strcmp(Previous_strings{3}(1:40), '$ Composite Property Reference Material:')) % здесь нет ошибки с 40 и 41
                                            PSETS{PSET_read_counter}.Patran_laminate_name = [strtrim(Previous_strings{3}(41:length(Previous_strings{3}))) strtrim(Previous_strings{2}(3:length(Previous_strings{2})))];
                                            Index_shift = 1;
                                        end
                                    end
                                end
                                if (~isempty(PSETS{PSET_read_counter}.Patran_laminate_name))
                                    if ((length(Previous_strings{3+Index_shift} ) >= 47) && strcmp(Previous_strings{3+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                        PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{3+Index_shift}(47:length(Previous_strings{3+Index_shift})));
                                    else
                                        if ((length(Previous_strings{3+Index_shift} ) >= 3) && strcmp(Previous_strings{3+Index_shift}(1:2), '$ ')) % здесь нет ошибки с 3 и 2
                                            if ((length(Previous_strings{4+Index_shift} ) >= 47) && strcmp(Previous_strings{4+Index_shift}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                                PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{4+Index_shift}(47:length(Previous_strings{4+Index_shift}))) strtrim(Previous_strings{3+Index_shift}(3:length(Previous_strings{3+Index_shift})))];
                                            end
                                        end
                                    end
                                end
                            end
                        end
                        
                        % Чтение Z0
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 40)
                                End_index = length(string);
                            else
                                End_index = 40;
                            end
                            tmp_number = str2double(string(25:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.Z0 = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.Z0 = tmp_number;
                            end
                        end

                        % Чтение NSM
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            tmp_number = str2double(string(41:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.NSM = tmp_number;
                            end
                        end

                        % Чтение SB
                        if (length(Trim_CR_LF(string)) > 56)
                            if (length(string) < 72)
                                End_index = length(string);
                            else
                                End_index = 72;
                            end
                            tmp_number = str2double(string(57:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.SB = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.SB = tmp_number;
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PCOMPG* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~(string(1) == '*'))
                            fprintf (1, '\nВторая строка в карточке PCOMPG* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PCOMPG* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end                

                        % Чтение FT
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 24)
                                End_index = length(string);
                            else
                                End_index = 24;
                            end
                            if (~isempty(strtrim(string(9:End_index))))
                                PSETS{PSET_read_counter}.FT = strtrim(string(9:End_index));
                            end
                        end

                        % Чтение TREF
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 40)
                                End_index = length(string);
                            else
                                End_index = 40;
                            end
                            tmp_number = str2double(string(25:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(25:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.TREF = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.TREF = tmp_number;
                            end
                        end

                        % Чтение GE
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            tmp_number = str2double(string(41:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(41:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.GE = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.GE = tmp_number;
                            end
                        end

                        % Чтение LAM
                        if (length(Trim_CR_LF(string)) > 56)
                            if (length(string) < 72)
                                End_index = length(string);
                            else
                                End_index = 72;
                            end
                            if (~isempty(strtrim(string(57:End_index))))
                                PSETS{PSET_read_counter}.LAM = strtrim(string(57:End_index));
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PCOMPG* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);
                        
                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 третьей строки карточки PCOMPG* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end 
                        
                        % Проверка первого символа
                        if (~((string(1) == '*') || (string(1) == ' ')))
                            fprintf (1, '\nТретья строка карточки PCOMPG* с номером %i не начинается с символа * или с пробела !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Строка * без полей
                        if ((string(1) == '*') && (length(strtrim(string)) == 1))
                            fprintf (1, '\nПустая третья строка карточки PCOMPG* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Строка только из белых символов
                        if (isempty(strtrim(string)))
                            fprintf (1, '\nПустая третья строка карточки PCOMPG* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Проверка длины строки
                        if (length(string) <= 2)
                            fprintf (1, '\nСтрока из двух или менее символов в карточке PCOMPG* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Проверка длины первого поля
                        if (length(Trim_CR_LF(string)) < 8)
                            fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке PCOMPG* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Не считано ни одного слоя ламината.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Установка информационных параметров
                        Card_name = 'PCOMPG*';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        switch string(1)

                            case ' '
                                Previous_index = 8;
                                Record_length = 8;
                                Next_string_large = 0;
                                Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                                End_card_flag = 0;

                            case '*'
                                Previous_index = 8;
                                Record_length = 16;
                                Next_string_large = 1; % Так как это всегда первая (открывающая) строка
                                Record_read_counter = 0; % Отсчет прочтенных полей начинается со второго поля карточки
                                End_card_flag = 0;

                        end

                        % Флаг первого слоя
                        First_ply_flag = 1;

                        % Чтение слоев
                        while (1)

                            PSETS{PSET_read_counter}.N_plies = PSETS{PSET_read_counter}.N_plies + 1;

                            if ((First_ply_flag == 1) && (PSETS{PSET_read_counter}.N_plies > 1))
                                First_ply_flag = 0;
                            end
                            
                            % Чтение GPLYIDi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_I(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с глобальным номером слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с глобальным номером слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с глобальным номером слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,1) = Read_Result;

                            % Чтение MIDi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                if (First_ply_flag == 1)
                                    fprintf (1, '\nПустая запись с номером первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,2);
                                end
                            else
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,2) = Read_Result;
                            end

                            % Чтение Ti
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                if (First_ply_flag == 1)
                                    fprintf (1, '\nПустая запись с толщиной первого слоя в карточке %s с номером %i !\n', Card_name, Item_ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,3) = PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies-1,3);
                                end
                            else
                                PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,3) = Read_Result;
                            end                    

                            % Чтение THETAi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_R(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode == -2)
                                fprintf (1, '\nПустая запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                return;
                            end

                            if (ErrCode == -3)
                                fprintf (1, '\nНеправильная запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                return;
                            end

                            if (ErrCode < 0)
                                return;
                            end

                            if (isempty(Read_Result))
                                fprintf (1, '\nОтсутствует запись с ориентацией слоя %i в карточке %s с номером %i !\n', PSETS{PSET_read_counter}.N_plies, Card_name, Item_ID);
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end

                            PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,4) = Read_Result;

                            % Чтение SOUTi
                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_CB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))

                                switch upper(Read_Result)

                                    case 'YES'

                                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,5) = 1;

                                    case 'NO'

                                        PSETS{PSET_read_counter}.Laminate(PSETS{PSET_read_counter}.N_plies,5) = 0;

                                    otherwise

                                        fprintf (1, '\nНеизвестная запись с параметром SOUT в карточке %s с номером %i [%s]!\n', Card_name, Item_ID, Read_Result);
                                        ErrCode = -1;
                                        return;

                                end

                            end
                            
                            % Чтение GEFLG
                            if (First_ply_flag == 1)
                                
                                [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                                if (ErrCode < 0)
                                    return;
                                end

                                if (~isempty(Read_Result))
                                    PSETS{PSET_read_counter}.GEFLG = Read_Result;
                                end
                                
                            end
                            
                            % Перевод на следующую строку
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (End_card_flag == 1)
                                break;
                            end

                        end

                        % Проверка на число слоев ламината
                        if (PSETS{PSET_read_counter}.N_plies == 0)
                            fprintf (1, '\nНулевое число слоев ламината в карточке %s с номером %i !\n', Card_name, Item_ID);
                            ErrCode = -1;
                            return;
                        end

                        % Финализация массива слоев
                        PSETS{PSET_read_counter}.Laminate = PSETS{PSET_read_counter}.Laminate(1:PSETS{PSET_read_counter}.N_plies,:);
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PCOMPG,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [PCOMPG%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            % Чтение PSOLID
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'SOLID ')) % SMALL FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PSOLID';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.Mat_ID = [];
                PSETS{PSET_read_counter}.CORDM = 0;
                PSETS{PSET_read_counter}.IN = [];
                PSETS{PSET_read_counter}.STRESS = [];
                PSETS{PSET_read_counter}.ISOP = [];
                PSETS{PSET_read_counter}.FCTN = [];
                PSETS{PSET_read_counter}.COROT = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PSOLID : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 карточки PSOLID %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение Mat_ID
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                tmp_number = str2double(string(17:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером материала в карточке PSOLID : [%s] !\n', strtrim(string(17:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.Mat_ID = tmp_number;
                
                % Чтение CORDM
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 32)
                        End_index = length(string);
                    else
                        End_index = 32;
                    end
                    if (~isnan(str2double(string(25:End_index))))
                        PSETS{PSET_read_counter}.CORDM = str2double(string(25:End_index));
                    end
                end
                
                % Чтение IN
                if (length(Trim_CR_LF(string)) > 32)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    if (~isempty(strtrim(string(33:End_index))))
                        if (~isnan(str2double(string(33:End_index))))
                            PSETS{PSET_read_counter}.IN = str2double(string(33:End_index));
                        else
                            PSETS{PSET_read_counter}.IN = strtrim(string(33:End_index));
                        end
                    end
                end
                
                % Чтение STRESS
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 48)
                        End_index = length(string);
                    else
                        End_index = 48;
                    end
                    if (~isempty(strtrim(string(41:End_index))))
                        if (~isnan(str2double(string(41:End_index))))
                            PSETS{PSET_read_counter}.STRESS = str2double(string(41:End_index));
                        else
                            PSETS{PSET_read_counter}.STRESS = strtrim(string(41:End_index));
                        end
                    end
                end
                
                % Чтение ISOP
                if (length(Trim_CR_LF(string)) > 48)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    if (~isempty(strtrim(string(49:End_index))))
                        if (~isnan(str2double(string(49:End_index))))
                            PSETS{PSET_read_counter}.ISOP = str2double(string(49:End_index));
                        else
                            PSETS{PSET_read_counter}.ISOP = strtrim(string(49:End_index));
                        end
                    end
                end
                
                % Чтение FCTN
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 64)
                        End_index = length(string);
                    else
                        End_index = 64;
                    end
                    if (~isempty(strtrim(string(57:End_index))))
                        PSETS{PSET_read_counter}.FCTN = strtrim(string(57:End_index));
                    end
                end
                
                % Чтение COROT
                if (length(Trim_CR_LF(string)) > 64)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    if (~isnan(str2double(string(65:End_index))))
                        PSETS{PSET_read_counter}.COROT = str2double(string(65:End_index));
                    end
                end
                
                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'SOLID*')) % LARGE FIELD FORMAT
                
                PSET_read_counter = PSET_read_counter + 1;
                
                PSETS{PSET_read_counter}.card = 'PSOLID';
                PSETS{PSET_read_counter}.ID = [];
                PSETS{PSET_read_counter}.Patran_name = [];
                PSETS{PSET_read_counter}.Mat_ID = [];
                PSETS{PSET_read_counter}.CORDM = 0;
                PSETS{PSET_read_counter}.IN = [];
                PSETS{PSET_read_counter}.STRESS = [];
                PSETS{PSET_read_counter}.ISOP = [];
                PSETS{PSET_read_counter}.FCTN = [];
                PSETS{PSET_read_counter}.COROT = [];
                
                % Чтение ID
                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером property set в карточке PSOLID* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.ID = tmp_number;
                
                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PSOLID* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение Patran_name
                if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                    PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                else
                    if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                        if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                        end
                    end
                end
                
                % Чтение Mat_ID
                if (length(string) < 40)
                    End_index = length(string);
                else
                    End_index = 40;
                end
                tmp_number = str2double(string(25:End_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером материала в карточке PSOLID* : [%s] !\n', strtrim(string(25:End_index)));
                    ErrCode = -1;
                    return;
                end
                PSETS{PSET_read_counter}.Mat_ID = tmp_number;
                
                % Чтение CORDM
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    if (~isnan(str2double(string(41:End_index))))
                        PSETS{PSET_read_counter}.CORDM = str2double(string(41:End_index));
                    end
                end
                
                % Чтение IN
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    if (~isempty(strtrim(string(57:End_index))))
                        if (~isnan(str2double(string(57:End_index))))
                            PSETS{PSET_read_counter}.IN = str2double(string(57:End_index));
                        else
                            PSETS{PSET_read_counter}.IN = strtrim(string(57:End_index));
                        end
                    end
                end
                
                % Проверка на конец файла
                if (feof(Fin))
                    fprintf (1, '\nНеожиданный конец файла во время чтения карточки PSOLID* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                    ErrCode = -1;
                    return;
                end
                
                % Чтение следующей строки
                N_prev_str = size(Previous_strings,1);
                for p=1:N_prev_str-1
                    Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                end
                Previous_strings{1} = string;
                string = fgets(Fin);

                % Проверка строки
                if (~(string(1) == '*'))
                    fprintf (1, '\nВторая строка в карточке PSOLID* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                    ErrCode = -1;
                    return;
                end

                % Проверка на записи в 10-ом поле
                if (deblank(string) > 72)
                    fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PSOLID* %i !\n', PSETS{PSET_read_counter}.ID);
                    fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                    ErrCode = -1;
                    return;
                end
                
                % Чтение STRESS
                if (length(Trim_CR_LF(string)) > 8)
                    if (length(string) < 24)
                        End_index = length(string);
                    else
                        End_index = 24;
                    end
                    if (~isempty(strtrim(string(9:End_index))))
                        if (~isnan(str2double(string(9:End_index))))
                            PSETS{PSET_read_counter}.STRESS = str2double(string(9:End_index));
                        else
                            PSETS{PSET_read_counter}.STRESS = strtrim(string(9:End_index));
                        end
                    end
                end
                
                % Чтение ISOP
                if (length(Trim_CR_LF(string)) > 24)
                    if (length(string) < 40)
                        End_index = length(string);
                    else
                        End_index = 40;
                    end
                    if (~isempty(strtrim(string(25:End_index))))
                        if (~isnan(str2double(string(25:End_index))))
                            PSETS{PSET_read_counter}.ISOP = str2double(string(25:End_index));
                        else
                            PSETS{PSET_read_counter}.ISOP = strtrim(string(25:End_index));
                        end
                    end
                end
                
                % Чтение FCTN
                if (length(Trim_CR_LF(string)) > 40)
                    if (length(string) < 56)
                        End_index = length(string);
                    else
                        End_index = 56;
                    end
                    if (~isempty(strtrim(string(41:End_index))))
                        PSETS{PSET_read_counter}.FCTN = strtrim(string(41:End_index));
                    end
                end
                
                % Чтение COROT
                if (length(Trim_CR_LF(string)) > 56)
                    if (length(string) < 72)
                        End_index = length(string);
                    else
                        End_index = 72;
                    end
                    if (~isnan(str2double(string(57:End_index))))
                        PSETS{PSET_read_counter}.COROT = str2double(string(57:End_index));
                    end
                end

                
                % Для вывода прогресса
                Counter = Counter + 1;
                Counter_2 = Counter_2 + 1;
                if (Counter_2 == N_rec_segm)
                    Counter_2 = 0;
                    Written_count = Written_count + 1;
                    if (Written_count < Time_segments)
                        fprintf (1, '#');
                        pause (Progress_Bar_Delay);
                    end
                end


                continue;
                
            end
            
            % Чтение PBRSECT (уникальное имя)
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'BRSECT'))

                if (length(string) < 8)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 8 в карточке PBRSECT [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(8)

                    case ' ' % SMALL FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBRSECT';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.FORM = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.Section_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBRSECT : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBRSECT %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 24)
                            End_index = length(string);
                        else
                            End_index = 24;
                        end
                        tmp_number = str2double(string(17:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBRSECT %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % Чтение FORM
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 32)
                                End_index = length(string);
                            else
                                End_index = 32;
                            end
                            if (~isempty(strtrim(string(25:End_index))))
                                PSETS{PSET_read_counter}.FORM = strtrim(string(25:End_index));
                            end
                        end
                        
                        % Чтение NSM
                        if (length(Trim_CR_LF(string)) > 32)
                            if (length(string) < 40)
                                End_index = length(string);
                            else
                                End_index = 40;
                            end
                            tmp_number = str2double(string(33:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(33:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.NSM = tmp_number;
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBRSECT с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~(string(1) == ' '))
                            fprintf (1, '\nВторая строка в карточке PBRSECT %i не начинается с пробела !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PBRSECT %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Section_data
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 72)
                                End_index = length(string);
                            else
                                End_index = 72;
                            end
                            if (isempty(strtrim(string(9:End_index))))
                                fprintf (1, '\nПустая запись с описанием сечения в карточке PBRSECT с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            else
                                PSETS{PSET_read_counter}.Section_data = strtrim(string(9:End_index));
                            end
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBRSECT';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.FORM = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.Section_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBRSECT* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBRSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 40)
                            End_index = length(string);
                        else
                            End_index = 40;
                        end
                        tmp_number = str2double(string(25:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBRSECT* %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % Чтение FORM
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            if (~isempty(strtrim(string(41:End_index))))
                                PSETS{PSET_read_counter}.FORM = strtrim(string(41:End_index));
                            end
                        end
                        
                        % Чтение NSM
                        if (length(Trim_CR_LF(string)) > 56)
                            if (length(string) < 72)
                                End_index = length(string);
                            else
                                End_index = 72;
                            end
                            tmp_number = str2double(string(57:End_index));
                            if (isnan(tmp_number))
                                tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                                if (size(tmp_number_2,1) == 2)
                                    PSETS{PSET_read_counter}.NSM = tmp_number_2(1)*10^tmp_number_2(2);
                                end
                            else
                                PSETS{PSET_read_counter}.NSM = tmp_number;
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBRSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~(string(1) == '*'))
                            fprintf (1, '\nВторая строка в карточке PBRSECT* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PBRSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBRSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~((string(1) == '*') || (string(1) == ' ')))
                            fprintf (1, '\nТретья строка в карточке PBRSECT* с номером %i не начинается с символа * или с пробела !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 третьей строки карточки PBRSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        if (string(1) == '*')
                            
                            % Третья строка формата LARGE FIELD FORMAT
                            
                            % Чтение Section_data
                            if (length(Trim_CR_LF(string)) > 8)
                                if (length(string) < 72)
                                    End_index = length(string);
                                else
                                    End_index = 72;
                                end
                                if (isempty(strtrim(string(9:End_index))))
                                    fprintf (1, '\nПустая запись с описанием сечения в карточке PBRSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Section_data = strtrim(string(9:End_index));
                                end
                            end
                            
                            % Проверка на конец файла
                            if (feof(Fin))
                                fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBRSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % Чтение следующей строки
                            N_prev_str = size(Previous_strings,1);
                            for p=1:N_prev_str-1
                                Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                            end
                            Previous_strings{1} = string;
                            string = fgets(Fin);

                            % Проверка строки
                            if (~(string(1) == '*'))
                                fprintf (1, '\nЧетвертая строка в карточке PBRSECT* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % Проверка на записи в 10-ом поле
                            if (deblank(string) > 72)
                                fprintf (1, '\nОбнаружена запись в поле 10 четвертой строки карточки PBRSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end
                            
                            % Чтение Section_data (продолжение)
                            if (length(Trim_CR_LF(string)) > 8)
                                if (length(string) < 72)
                                    End_index = length(string);
                                else
                                    End_index = 72;
                                end
                                if (~isempty(strtrim(string(9:End_index))))
                                    PSETS{PSET_read_counter}.Section_data = [PSETS{PSET_read_counter}.Section_data strtrim(string(9:End_index))];
                                end
                            end
                            
                        else
                            
                            % Третья строка формата SMALL FIELD FORMAT
                            
                            % Чтение Section_data
                            if (length(Trim_CR_LF(string)) > 8)
                                if (length(string) < 72)
                                    End_index = length(string);
                                else
                                    End_index = 72;
                                end
                                if (isempty(strtrim(string(9:End_index))))
                                    fprintf (1, '\nПустая запись с описанием сечения в карточке PBRSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Section_data = strtrim(string(9:End_index));
                                end
                            end
                            
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBRSECT,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 8 в карточке [PBRSECT%s] !\n', string(8));
                        ErrCode = -1;
                        return; 

                end
                
            end
            
            % Чтение PBMSECT (уникальное имя)
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'BMSECT'))

                if (length(string) < 8)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 8 в карточке PBMSECT [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(8)

                    case ' ' % SMALL FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBMSECT';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.FORM = [];
                        PSETS{PSET_read_counter}.Section_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBMSECT : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBMSECT %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 24)
                            End_index = length(string);
                        else
                            End_index = 24;
                        end
                        tmp_number = str2double(string(17:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBMSECT %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % Чтение FORM
                        if (length(Trim_CR_LF(string)) > 24)
                            if (length(string) < 32)
                                End_index = length(string);
                            else
                                End_index = 32;
                            end
                            if (~isempty(strtrim(string(25:End_index))))
                                PSETS{PSET_read_counter}.FORM = strtrim(string(25:End_index));
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBMSECT с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~(string(1) == ' '))
                            fprintf (1, '\nВторая строка в карточке PBMSECT %i не начинается с пробела !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PBMSECT %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Чтение Section_data
                        if (length(Trim_CR_LF(string)) > 8)
                            if (length(string) < 72)
                                End_index = length(string);
                            else
                                End_index = 72;
                            end
                            if (isempty(strtrim(string(9:End_index))))
                                fprintf (1, '\nПустая запись с описанием сечения в карточке PBMSECT с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            else
                                PSETS{PSET_read_counter}.Section_data = strtrim(string(9:End_index));
                            end
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case '*' % LARGE FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBMSECT';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.FORM = [];
                        PSETS{PSET_read_counter}.Section_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBMSECT* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBMSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 40)
                            End_index = length(string);
                        else
                            End_index = 40;
                        end
                        tmp_number = str2double(string(25:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBMSECT* %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % Чтение FORM
                        if (length(Trim_CR_LF(string)) > 40)
                            if (length(string) < 56)
                                End_index = length(string);
                            else
                                End_index = 56;
                            end
                            if (~isempty(strtrim(string(41:End_index))))
                                PSETS{PSET_read_counter}.FORM = strtrim(string(41:End_index));
                            end
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBMSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~(string(1) == '*'))
                            fprintf (1, '\nВторая строка в карточке PBMSECT* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 второй строки карточки PBMSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        % Проверка на конец файла
                        if (feof(Fin))
                            fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBMSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Чтение следующей строки
                        N_prev_str = size(Previous_strings,1);
                        for p=1:N_prev_str-1
                            Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                        end
                        Previous_strings{1} = string;
                        string = fgets(Fin);

                        % Проверка строки
                        if (~((string(1) == '*') || (string(1) == ' ')))
                            fprintf (1, '\nТретья строка в карточке PBMSECT* с номером %i не начинается с символа * или с пробела !\n', PSETS{PSET_read_counter}.ID);
                            ErrCode = -1;
                            return;
                        end

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 третьей строки карточки PBMSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end
                        
                        if (string(1) == '*')
                            
                            % Третья строка формата LARGE FIELD FORMAT
                            
                            % Чтение Section_data
                            if (length(Trim_CR_LF(string)) > 8)
                                if (length(string) < 72)
                                    End_index = length(string);
                                else
                                    End_index = 72;
                                end
                                if (isempty(strtrim(string(9:End_index))))
                                    fprintf (1, '\nПустая запись с описанием сечения в карточке PBMSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Section_data = strtrim(string(9:End_index));
                                end
                            end
                            
                            % Проверка на конец файла
                            if (feof(Fin))
                                fprintf (1, '\nНеожиданный конец файла во время чтения карточки PBMSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % Чтение следующей строки
                            N_prev_str = size(Previous_strings,1);
                            for p=1:N_prev_str-1
                                Previous_strings{N_prev_str+1-p} = Previous_strings{N_prev_str-p};
                            end
                            Previous_strings{1} = string;
                            string = fgets(Fin);

                            % Проверка строки
                            if (~(string(1) == '*'))
                                fprintf (1, '\nЧетвертая строка в карточке PBMSECT* %i не начинается с символа * !\n', PSETS{PSET_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % Проверка на записи в 10-ом поле
                            if (deblank(string) > 72)
                                fprintf (1, '\nОбнаружена запись в поле 10 четвертой строки карточки PBMSECT* %i !\n', PSETS{PSET_read_counter}.ID);
                                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end
                            
                            % Чтение Section_data (продолжение)
                            if (length(Trim_CR_LF(string)) > 8)
                                if (length(string) < 72)
                                    End_index = length(string);
                                else
                                    End_index = 72;
                                end
                                if (~isempty(strtrim(string(9:End_index))))
                                    PSETS{PSET_read_counter}.Section_data = [PSETS{PSET_read_counter}.Section_data strtrim(string(9:End_index))];
                                end
                            end
                            
                        else
                            
                            % Третья строка формата SMALL FIELD FORMAT
                            
                            % Чтение Section_data
                            if (length(Trim_CR_LF(string)) > 8)
                                if (length(string) < 72)
                                    End_index = length(string);
                                else
                                    End_index = 72;
                                end
                                if (isempty(strtrim(string(9:End_index))))
                                    fprintf (1, '\nПустая запись с описанием сечения в карточке PBMSECT* с номером %i !\n', PSETS{PSET_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                else
                                    PSETS{PSET_read_counter}.Section_data = strtrim(string(9:End_index));
                                end
                            end
                            
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBMSECT,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 8 в карточке [PBMSECT%s] !\n', string(8));
                        ErrCode = -1;
                        return; 

                end
                
            end
            
            % Чтение PBCOMP (уникальное имя)
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BCOMP'))

                if (length(string) < 7)

                    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: length(string) < 7 в карточке PBCOMP [%s]!\n', string);
                    ErrCode = -1;
                    return; 

                end

                switch string(7)

                    case ' ' % SMALL FIELD FORMAT

                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBCOMP';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.A = [];
                        PSETS{PSET_read_counter}.I1 = [];
                        PSETS{PSET_read_counter}.I2 = [];
                        PSETS{PSET_read_counter}.I12 = [];
                        PSETS{PSET_read_counter}.J = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.K1 = [];
                        PSETS{PSET_read_counter}.K2 = [];
                        PSETS{PSET_read_counter}.M1 = [];
                        PSETS{PSET_read_counter}.M2 = [];
                        PSETS{PSET_read_counter}.N1 = [];
                        PSETS{PSET_read_counter}.N2 = [];
                        PSETS{PSET_read_counter}.SYMOPT = [];
                        PSETS{PSET_read_counter}.N_lumped_areas = 0;
                        PSETS{PSET_read_counter}.Lumped_area_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:16));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBCOMP : [%s] !\n', strtrim(string(9:16)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBCOMP %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 24)
                            End_index = length(string);
                        else
                            End_index = 24;
                        end
                        tmp_number = str2double(string(17:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBCOMP %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(17:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'PBCOMP';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 24;
                        Record_length = 8;
                        Next_string_large = 0;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение A

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.A = Read_Result;
                        end

                        % Чтение I1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.I1 = Read_Result;
                        end

                        % Чтение I2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.I2 = Read_Result;
                        end

                        % Чтение I12

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.I12 = Read_Result;
                        end

                        % Чтение J

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.J = Read_Result;
                        end

                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.NSM = Read_Result;
                        end
                        
                        % Чтение K1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.K1 = Read_Result;
                        end

                        % Чтение K2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.K2 = Read_Result;
                        end
                        
                        % Чтение M1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.M1 = Read_Result;
                        end

                        % Чтение M2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.M2 = Read_Result;
                        end
                        
                        % Чтение N1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.N1 = Read_Result;
                        end

                        % Чтение N2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.N2 = Read_Result;
                        end
                        
                        % Чтение SYMOPT
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.SYMOPT = Read_Result;
                        end
                        
                        % Пропуск пустого поля
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение сосредоточенных элементов сечения
                        
                        PSETS{PSET_read_counter}.Lumped_area_data = cell(N_pbcomp_lumped_areas_preallocated,1);
                        
                        while(1)
                            
                            Field_read_flag = 0;
                            
                            PSETS{PSET_read_counter}.N_lumped_areas = PSETS{PSET_read_counter}.N_lumped_areas + 1;
                            
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Y = [];
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Z = [];
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.C = [];
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.MID = [];
                            
                            % Чтение Y

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Y = Read_Result;
                            end
                            
                            % Чтение Z

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Z = Read_Result;
                            end
                            
                            % Чтение C

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.C = Read_Result;
                            end
                            
                            % Чтение MID

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.MID = Read_Result;
                            end
                            
                            % Перевод на следующую строку
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (End_card_flag == 1)
                                break;
                            end
                            
                            % Если в действительности не считано ни одного поля, то выходим из цикла
                            if (Field_read_flag == 0)
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas} = [];
                                PSETS{PSET_read_counter}.N_lumped_areas = PSETS{PSET_read_counter}.N_lumped_areas - 1;
                                break;
                            end
                            
                            % Если конец карточки, то выходим из цикла
                            if (End_card_flag == 1)
                                break;
                            end
                            
                        end
                        
                        % Если не было считано ни одного сосредоточенного элемента сечения
                        if (PSETS{PSET_read_counter}.N_lumped_areas == 0)
                            PSETS{PSET_read_counter}.Lumped_area_data = [];
                        end
                        
                        % финализация массива ячеек Lumped_area_data
                        if (PSETS{PSET_read_counter}.N_lumped_areas > 0)
                            PSETS{PSET_read_counter}.Lumped_area_data = PSETS{PSET_read_counter}.Lumped_area_data(1:PSETS{PSET_read_counter}.N_lumped_areas);
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;
                        
                    case '*' % LARGE FIELD FORMAT
                        
                        PSET_read_counter = PSET_read_counter + 1;
                        
                        PSETS{PSET_read_counter}.card = 'PBCOMP';
                        PSETS{PSET_read_counter}.ID = [];
                        PSETS{PSET_read_counter}.Patran_name = [];
                        PSETS{PSET_read_counter}.MID = [];
                        PSETS{PSET_read_counter}.A = [];
                        PSETS{PSET_read_counter}.I1 = [];
                        PSETS{PSET_read_counter}.I2 = [];
                        PSETS{PSET_read_counter}.I12 = [];
                        PSETS{PSET_read_counter}.J = [];
                        PSETS{PSET_read_counter}.NSM = [];
                        PSETS{PSET_read_counter}.K1 = [];
                        PSETS{PSET_read_counter}.K2 = [];
                        PSETS{PSET_read_counter}.M1 = [];
                        PSETS{PSET_read_counter}.M2 = [];
                        PSETS{PSET_read_counter}.N1 = [];
                        PSETS{PSET_read_counter}.N2 = [];
                        PSETS{PSET_read_counter}.SYMOPT = [];
                        PSETS{PSET_read_counter}.N_lumped_areas = 0;
                        PSETS{PSET_read_counter}.Lumped_area_data = [];
                        
                        % Чтение ID
                        tmp_number = str2double(string(9:24));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с номером property set в карточке PBCOMP* : [%s] !\n', strtrim(string(9:24)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.ID = tmp_number;

                        % Проверка на записи в 10-ом поле
                        if (deblank(string) > 72)
                            fprintf (1, '\nОбнаружена запись в поле 10 первой строки карточки PBCOMP* %i !\n', PSETS{PSET_read_counter}.ID);
                            fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                            fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
                            ErrCode = -1;
                            return;
                        end

                        % Чтение Patran_name
                        if ((length(Previous_strings{1} ) >= 47) && strcmp(Previous_strings{1}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                            PSETS{PSET_read_counter}.Patran_name = strtrim(Previous_strings{1}(47:length(Previous_strings{1})));
                        else
                            if ((length(Previous_strings{1} ) >= 3) && strcmp(Previous_strings{1}(1:2), '$ '))
                                if ((length(Previous_strings{2} ) >= 47) && strcmp(Previous_strings{2}(1:46), '$ Elements and Element Properties for region :')) % здесь нет ошибки с 47 и 46
                                    PSETS{PSET_read_counter}.Patran_name = [strtrim(Previous_strings{2}(47:length(Previous_strings{2}))) strtrim(Previous_strings{1}(3:length(Previous_strings{1})))];
                                end
                            end
                        end

                        % Чтение MID
                        if (length(string) < 40)
                            End_index = length(string);
                        else
                            End_index = 40;
                        end
                        tmp_number = str2double(string(25:End_index));
                        if (isnan(tmp_number))
                            fprintf (1, '\nНеправильная запись с полем MID в карточке PBCOMP* %i : [%s] !\n', PSETS{PSET_read_counter}.ID, strtrim(string(25:End_index)));
                            ErrCode = -1;
                            return;
                        end
                        PSETS{PSET_read_counter}.MID = tmp_number;
                        
                        % --- УНИВЕРСАЛЬНЫЙ АЛГОРИТМ ДЛЯ КАРТОЧЕК С ФИКСИРОВАННЫМ ЧИСЛОМ НЕОБЯЗАТЕЛЬНЫХ ПОЛЕЙ ---

                        % Установка информационных параметров
                        Card_name = 'PBCOMP*';
                        Item_ID = PSETS{PSET_read_counter}.ID;

                        % Установка стартовых параметров
                        Previous_index = 40;
                        Record_length = 16;
                        Next_string_large = 1;
                        Record_read_counter = 2; % Отсчет прочтенных полей начинается со второго поля карточки
                        End_card_flag = 0;
                        
                        % Чтение A

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.A = Read_Result;
                        end

                        % Чтение I1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.I1 = Read_Result;
                        end

                        % Чтение I2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.I2 = Read_Result;
                        end

                        % Чтение I12

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.I12 = Read_Result;
                        end

                        % Чтение J

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.J = Read_Result;
                        end

                        % Чтение NSM

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.NSM = Read_Result;
                        end
                        
                        % Чтение K1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.K1 = Read_Result;
                        end

                        % Чтение K2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.K2 = Read_Result;
                        end
                        
                        % Чтение M1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.M1 = Read_Result;
                        end

                        % Чтение M2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.M2 = Read_Result;
                        end
                        
                        % Чтение N1

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.N1 = Read_Result;
                        end

                        % Чтение N2

                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                        if (ErrCode < 0)
                            return;
                        end

                        if (~isempty(Read_Result))
                            PSETS{PSET_read_counter}.N2 = Read_Result;
                        end
                        
                        % Чтение SYMOPT
                        
                        [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        if (~isempty(Read_Result))
                            ELEMENTS{Element_read_counter}.SYMOPT = Read_Result;
                        end
                        
                        % Пропуск пустого поля
                        [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_Skip(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);
                        
                        if (ErrCode < 0)
                            return;
                        end
                        
                        % Чтение сосредоточенных элементов сечения
                        
                        PSETS{PSET_read_counter}.Lumped_area_data = cell(N_pbcomp_lumped_areas_preallocated,1);
                        
                        while(1)
                            
                            Field_read_flag = 0;
                            
                            PSETS{PSET_read_counter}.N_lumped_areas = PSETS{PSET_read_counter}.N_lumped_areas + 1;
                            
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Y = [];
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Z = [];
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.C = [];
                            PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.MID = [];
                            
                            % Чтение Y

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Y = Read_Result;
                            end
                            
                            % Чтение Z

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.Z = Read_Result;
                            end
                            
                            % Чтение C

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_RB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.C = Read_Result;
                            end
                            
                            % Чтение MID

                            [Read_Result, Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_IB(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (ErrCode < 0)
                                return;
                            end

                            if (~isempty(Read_Result))
                                Field_read_flag = 1;
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas}.MID = Read_Result;
                            end
                            
                            % Перевод на следующую строку
                            [Fin, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings] = Read_Field_New_Line(Fin, Card_name, Item_ID, Previous_index, Record_length, Next_string_large, Record_read_counter, End_card_flag, string, Previous_strings);

                            if (End_card_flag == 1)
                                break;
                            end
                            
                            % Если в действительности не считано ни одного поля, то выходим из цикла
                            if (Field_read_flag == 0)
                                PSETS{PSET_read_counter}.Lumped_area_data{PSETS{PSET_read_counter}.N_lumped_areas} = [];
                                PSETS{PSET_read_counter}.N_lumped_areas = PSETS{PSET_read_counter}.N_lumped_areas - 1;
                                break;
                            end
                            
                            % Если конец карточки, то выходим из цикла
                            if (End_card_flag == 1)
                                break;
                            end
                            
                        end
                        
                        % Если не было считано ни одного сосредоточенного элемента сечения
                        if (PSETS{PSET_read_counter}.N_lumped_areas == 0)
                            PSETS{PSET_read_counter}.Lumped_area_data = [];
                        end
                        
                        % финализация массива ячеек Lumped_area_data
                        if (PSETS{PSET_read_counter}.N_lumped_areas > 0)
                            PSETS{PSET_read_counter}.Lumped_area_data = PSETS{PSET_read_counter}.Lumped_area_data(1:PSETS{PSET_read_counter}.N_lumped_areas);
                        end
                        
                        
                        % Для вывода прогресса
                        Counter = Counter + 1;
                        Counter_2 = Counter_2 + 1;
                        if (Counter_2 == N_rec_segm)
                            Counter_2 = 0;
                            Written_count = Written_count + 1;
                            if (Written_count < Time_segments)
                                fprintf (1, '#');
                                pause (Progress_Bar_Delay);
                            end
                        end


                        continue;

                    case ',' % FREE FIELD FORMAT

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBCOMP,] !\n');
                        ErrCode = -1;
                        return; 

                    otherwise

                        fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: непредвиденное значение символа 7 в карточке [PBCOMP%s] !\n', string(7));
                        ErrCode = -1;
                        return; 

                end

            end
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'BAR,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBAR,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BEAM,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBEAM,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'BUSH,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PBUSH,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'SHELL,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PSHELL,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 6) && strcmpi(string(2:6), 'COMP,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PCOMP,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 5) && strcmpi(string(2:5), 'ROD,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PROD,] !\n');
                ErrCode = -1;
                return; 

            end
            
            if ((length(string) >= 7) && strcmpi(string(2:7), 'SOLID,')) % FREE FIELD FORMAT

                fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [PSOLID,] !\n');
                ErrCode = -1;
                return; 

            end
        
    end
    
end


% Для вывода прогресса
if (N_rec_segm == 0)
    for i=1:Time_segments-1
        fprintf (1, '#');
        pause (Progress_Bar_Delay);
    end
end
fprintf (1, '# ');
pause (Progress_Bar_Delay);


% Обработка исключений
if (PSET_read_counter ~= N_PSETS)
    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: PSET_read_counter ~= N_PSETS !\n');
    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
    ErrCode = -1;
    return;        
end

% Обработка исключений
if (Element_read_counter ~= N_Elements)
    fprintf (1, '\nОшибка функции Read_PSETS_ELEMENTS: Element_read_counter ~= N_Elements !\n');
    fprintf (1, 'Обратитесь к разработчику для решения этого вопроса.\n');
    ErrCode = -1;
    return;        
end

fprintf (1, 'OK!\n');
